3

我面临一个奇怪的问题。我环顾了整个 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<>可能是“旧式”。有人可以向我解释为什么会这样吗?我以为我可以通过查看 的定义找到答案WEOF,但在 Mac 上它被定义为__DARWIN_WEOF,我似乎无法找到它的定义。

谢谢!

4

1 回答 1

2

宏本身很可能__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

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

于 2011-12-24T18:42:28.890 回答