在某些代码中得到了这个序列。希望将函数调用中的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标签
代码是:
reinterpret_cast<char *>(&messageBuffer)
如果有任何读者想知道,是的,带有标志FormatMessageA的Windows API函数FORMAT_MESSAGE_ALLOCATE_BUFFER
确实指定了这种用法。
请注意,如果使用FormatMessageW
,那么演员阵容将是wchar_t *
。我们无法分辨,因为你隐藏了这个宏FORMAT_MESSAGE
背后的函数名称。
如果您使用普通文本宏进行Windows API编程,那么您可以使用:
reinterpret_cast<LPTSTR>(&messageBuffer)
并且应该也可以将messageBuffer
声明为void *messageBuffer;
或LPTSTR messageBuffer;
。
策略通常是有原因的,使用C ++强制转换比C强制转换有两个原因。
如果你只是在那里打一个reinterpret_cast
以遵守公司政策,那么1号大多不在窗外。
我个人会保留C版,因为当设置某个标志时,API需要它来投射,但我也会尝试使其类型安全且尽可能严格
(LPTSTR)const_cast<LPTSTR*>(&messageBuffer)
但如果政策没有余地,那么你可以完全使用C ++
reinterpret_cast<LPTSTR>(const_cast<LPTSTR*>(&messageBuffer))