发布
社区首页 >问答首页 >将c样式强制转换为正确的c++强制转换

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

Stack Overflow用户
提问于 2018-03-02 02:24:39
回答 2查看 122关注 0票数 0

在一些代码中得到了这个序列。希望将函数调用中的c样式强制转换转换为c++样式强制转换。

代码语言:javascript
代码运行次数:0
复制
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标记

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-03-02 02:29:18

守则将是:

代码语言:javascript
代码运行次数:0
复制
reinterpret_cast<char *>(&messageBuffer)

如果读者有疑问的话,是的,带有标志FormatMessageA的Windows函数FORMAT_MESSAGE_ALLOCATE_BUFFER实际上指定了这个用法。

请注意,如果正在使用FormatMessageW,则转换为wchar_t *。我们无法分辨,因为您已经隐藏了这个宏FORMAT_MESSAGE后面的函数名。

如果在Windows API编程中使用普通文本宏,则可以使用:

代码语言:javascript
代码运行次数:0
复制
reinterpret_cast<LPTSTR>(&messageBuffer)

并且可能还应该声明messageBuffervoid *messageBuffer;LPTSTR messageBuffer;

票数 2
EN

Stack Overflow用户

发布于 2018-03-02 03:00:45

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

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

如果你只是为了遵守公司的政策而在reinterpret_cast上打了一个耳光,那么第一大部分都会从窗口掉下来。

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

代码语言:javascript
代码运行次数:0
复制
(LPTSTR)const_cast<LPTSTR*>(&messageBuffer)

但是,如果策略没有任何回旋余地,那么您可以将其完全C++化。

代码语言:javascript
代码运行次数:0
复制
reinterpret_cast<LPTSTR>(const_cast<LPTSTR*>(&messageBuffer))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49061847

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档