将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强制转换有两个原因。

  1. 它们更安全/更严格,因为它们更好地理解类型。
  2. 与C演员不同,它们很容易进行文本搜索。

如果你只是在那里打一个reinterpret_cast以遵守公司政策,那么1号大多不在窗外。

我个人会保留C版,因为当设置某个标志时,API需要它来投射,但我也会尝试使其类型安全且尽可能严格

(LPTSTR)const_cast<LPTSTR*>(&messageBuffer)

但如果政策没有余地,那么你可以完全使用C ++

reinterpret_cast<LPTSTR>(const_cast<LPTSTR*>(&messageBuffer))

以上是关于将c样式转换转换为适当的c ++转换[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

C ++如何将用户的输入解析为要执行的代码? [关闭]

将 C++ 字符串操作转换为 C 的问题 [关闭]

如何将VB项目转换为C#项目[关闭]

在C#中是否可以在没有类型转换的情况下将整数转换为无符号整数? [关闭]

将科学计数法中的数字转换为十进制[关闭]

C# - 转换为格式的字符串? [关闭]