将 c 样式强制转换转换为正确的 c++ 转换

Converting a c style cast to a proper c++ cast

本文关键字:转换 c++ 样式      更新时间:2023-10-16

在某些代码中得到了这个序列。希望将函数调用中的 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)

如果任何读者想知道,是的,带有标志FORMAT_MESSAGE_ALLOCATE_BUFFER的Windows API函数FormatMessageA实际上指定了这种用法。

请注意,如果使用FormatMessageW,则强制转换将wchar_t * 。我们无法判断,因为您已经隐藏了此宏FORMAT_MESSAGE后面的函数名称。

如果您使用普通文本宏进行 Windows API 编程,则可以改为使用:

reinterpret_cast<LPTSTR>(&messageBuffer)

并且可能还应该将messageBuffer声明为 void *messageBuffer;LPTSTR messageBuffer;

策略

的存在通常是有原因的,并且有两个原因使用 C++ 强制转换而不是 C 转换。

  1. 它们更安全/更严格,因为它们更了解类型。
  2. 与 C 转换不同,它们很容易进行文本搜索。

数字 1 大多会掉出窗外,如果你只是在那里拍一个reinterpret_cast以遵守公司政策。

我个人会保留 C 强制转换,因为当设置某个标志时,API 需要它在那里转换,但我也会尝试使其类型安全并尽可能严格

,例如
(LPTSTR)const_cast<LPTSTR*>(&messageBuffer)

但是,如果政策的回旋余地为零,那么您可以使其完全C++

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