【问题标题】:Converting a c style cast to a proper c++ cast [closed]将 c 样式转换转换为正确的 c++ 转换 [关闭]
【发布时间】:2018-08-10 05:43:48
【问题描述】:

在一些代码中得到了这个序列。希望将函数调用中的 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 样式转换如果你的意思是为什么需要 (char*)&message 缓冲区?
  • 我没有问你为什么要改变 c cast,我是问你为什么需要 cast?
  • @user3891642 既然你是新手,我要警告你,这个问题可能不会得到很好的接受。另外,tourHow to Ask
  • 您真的打算创建一个char*,然后获取其地址(char**)并假装那个char*吗?坦率地说,这闻起来像个虫子。

标签: c++ winapi casting


【解决方案1】:

代码是:

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;

【讨论】:

    【解决方案2】:

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

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

    如果您只是在上面打一个 reinterpret_cast 以遵守公司政策,那么 1 号通常会掉出窗外。

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

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

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

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

    【讨论】:

    • 为什么需要const_cast
    • @IInspectable 确保源类型正确,然后再丢弃该类型信息。
    • 源类型已经经过适当的 cv 限定。
    • 这与 cv 无关,它是在一个完全不同的类型中捕获传递。我们希望编译器验证我们正在传递一个指向 LPTSTR 的指针,而 const_cast 会这样做。
    • 这真的需要一个很大的评论(以及这个答案中的解释)。将const_cast 用于与其预期目的完全无关的事情(“在具有不同 cv 限定的类型之间转换 [ing]。”)并不是很明显。如果没有评论,我会完全糊涂。
    猜你喜欢
    • 1970-01-01
    • 2016-04-18
    • 1970-01-01
    • 2015-12-29
    • 2015-09-16
    • 2011-05-11
    • 2011-01-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多