将c样式转换转换为适当的c ++转换[关闭]
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将c样式转换转换为适当的c ++转换[关闭]相关的知识,希望对你有一定的参考价值。
在某些代码中得到了这个序列。希望将函数调用中的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强制转换有两个原因。
- 它们更安全/更严格,因为它们更好地理解类型。
- 与C演员不同,它们很容易进行文本搜索。
如果你只是在那里打一个reinterpret_cast
以遵守公司政策,那么1号大多不在窗外。
我个人会保留C版,因为当设置某个标志时,API需要它来投射,但我也会尝试使其类型安全且尽可能严格
(LPTSTR)const_cast<LPTSTR*>(&messageBuffer)
但如果政策没有余地,那么你可以完全使用C ++
reinterpret_cast<LPTSTR>(const_cast<LPTSTR*>(&messageBuffer))
以上是关于将c样式转换转换为适当的c ++转换[关闭]的主要内容,如果未能解决你的问题,请参考以下文章