【问题标题】:llvm-g++-4.2 and C++ new-style type castingllvm-g++-4.2 和 C++ 新式类型转换
【发布时间】:2011-12-24 18:32:11
【问题描述】:

我遇到了一个奇怪的问题。我环顾了 stackoverflow.com 和其他地方,但没有找到答案。

这里有一些背景:我正在编写一个简单的库;主要用于教育目的和更好地理解 C++。我正在使用带有 Snow Leopard 的 MacBook Pro。我也安装了 Xcode 4.2,但是我只使用 VIM 来编辑我的代码。我最近完成了迄今为止我所拥有的任何东西的 GNU 构建系统,这样我就不必再依赖 Xcode,同时也不必编写和维护自定义 Makefile。我正在使用最高级别的警告。这是我目前得到的标志(但我会不断地添加它们,了解每个标志的原因):-Wall -Wmissing-field-initializers -Wno-trigraphs -Wreturn-type -Wnon-virtual-dtor -Woverloaded-virtual -Wmissing-braces -Wparentheses -Wswitch -Wunused-value -Wsign-compare -Waddress -Wsequence-point -Wshorten-64-to-32 -Wwrite-strings -Wold-style-cast,最后是-Werror

现在,我有一个非常简单地返回值的函数:

wint_t weof() {
  return static_cast<wint_t>(WEOF);
}

但是,当我编译此代码时,我收到警告“使用旧式强制转换”。我不明白static_cast&lt;&gt; 怎么可能是“老式”的。有人可以向我解释为什么会这样吗?我以为我可以通过查看WEOF 的定义找到答案,但在 Mac 上它被定义为 __DARWIN_WEOF,我似乎找不到它的定义。

谢谢!

【问题讨论】:

    标签: c++ osx-snow-leopard llvm-gcc


    【解决方案1】:

    __DARWIN_WEOF 宏本身很可能正在使用旧式转换(进行一些网络搜索,该值似乎很可能是 ((__darwin_wint_t)-1))。如果您使用与 C 兼容的标头,则不太可能完全启用 -Wold-style-cast

    作为一种解决方法,您可以尝试使用适当的#pragma 包围任何有问题的代码以禁用此警告。

    #pragma GCC diagnostic push
    #pragma GCC diagnostic ignored "-Wold-style-cast"
    // ... code goes here ...
    #pragma GCC diagnostic pop
    

    但这可能会在一段时间后变得相当烦人/冗长......

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-11
      • 1970-01-01
      • 2016-06-03
      • 1970-01-01
      • 2012-01-27
      • 1970-01-01
      • 2011-07-01
      • 1970-01-01
      相关资源
      最近更新 更多