将c样式转换转换为适当的c ++转换[关闭]

问题描述 投票:0回答:2

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

c++ winapi casting
2个回答
2
投票

代码是:

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;


1
投票

策略通常是有原因的,使用C ++强制转换比C强制转换有两个原因。

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

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

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

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

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

reinterpret_cast<LPTSTR>(const_cast<LPTSTR*>(&messageBuffer))
© www.soinside.com 2019 - 2024. All rights reserved.