在一些代码中得到了这个序列。希望将函数调用中的c样式强制转换转换为c++样式强制转换。
char* messageBuffer{ nullptr };
const unsigned long size{ FORMAT_MESSAGE(
FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
0,
errorMessageID,
MAKELANGID(LANG_NEUTRAL | SUBLANG_DEFAULT),
(char*)&messageBuffer, // this the one want to change
0,
0
)};
谢谢
编辑:为清晰起见添加了winapi标记
发布于 2018-03-02 02:29:18
守则将是:
reinterpret_cast<char *>(&messageBuffer)
如果读者有疑问的话,是的,带有标志FormatMessageA的Windows函数FORMAT_MESSAGE_ALLOCATE_BUFFER
实际上指定了这个用法。
请注意,如果正在使用FormatMessageW
,则转换为wchar_t *
。我们无法分辨,因为您已经隐藏了这个宏FORMAT_MESSAGE
后面的函数名。
如果在Windows API编程中使用普通文本宏,则可以使用:
reinterpret_cast<LPTSTR>(&messageBuffer)
并且可能还应该声明messageBuffer
为void *messageBuffer;
或LPTSTR messageBuffer;
。
发布于 2018-03-02 03:00:45
策略的存在通常是有原因的,在C上使用C++强制转换有两个原因。
如果你只是为了遵守公司的政策而在reinterpret_cast
上打了一个耳光,那么第一大部分都会从窗口掉下来。
我个人会保留C强制转换,因为当设置了某个标志时,API需要在那里进行转换,但我也会尝试使其类型安全并尽可能严格,例如
(LPTSTR)const_cast<LPTSTR*>(&messageBuffer)
但是,如果策略没有任何回旋余地,那么您可以将其完全C++化。
reinterpret_cast<LPTSTR>(const_cast<LPTSTR*>(&messageBuffer))
https://stackoverflow.com/questions/49061847
复制相似问题