有没有一种方法可以警告我全局命名空间污染?

9

gcc(或任何其他编译器)是否有一个选项可以警告我全局命名空间的污染?

我尝试编译一个样例应用程序套件,但结果发现其中很多头文件都存在全局命名空间污染(在头文件中使用using namespace),导致 Mac OS X 的全局结构体 Rect 变得不明确。我还尝试更改 #include 的顺序以先解析系统的 Rect 符号,然后再解决using namespace 的问题,但这会导致一些符号无法解析。

我之前在 Google 上搜索失败了,但如果存在这种警告选项,请给我提供信息。


1
搜索和删除 - 这些问题通常会一直存在/返回,直到被移除。 - justin
@Justin:问题在于,可能存在不在全局命名空间中的using namespace实例。 - Potatoswatter
@Potatoswatter 我并没有“打算”暗示每个using声明都应该被删除;只是全局的那些(也就是OP的主题)。 - justin
1
@Justin @Potatoswatter 在34个示例应用程序中,大约有75个using namespace实例似乎存在问题(源代码不少)。我知道我必须自己处理它们才能摆脱它们。但是,如果存在我所描述的警告选项,开发人员本身就会对全局范围内的using namespace持谨慎态度,这样可以避免我要经历的心理劳动。叹气 - Shigerello
@Shigerello 我理解这个问题并避免了许多常见的 using 用法,我意识到我的评论并不是对你的问题的直接回答(如果没有适当的答案来解决你的程序,则是间接回答)。如果你的目标是OSX,那么Matthieu M.的回答应该可以解决问题,如果你的程序在此时与clang兼容。如果我知道这个标志的存在,那就是我要留下的答案。 - justin
全球变暖 - 一个日益引起关注的问题 - sehe
1个回答

5

我不知道gcc是否有这个功能,但CLang有:

def warn_using_directive_in_header : Warning<
  "using namespace directive in global context in header">,
  InGroup<HeaderHygiene>, DefaultIgnore;

您可以直接使用-Wusing-directive-in-header或通过组-Wheader-hygiene来激活它(目前,它是该组的唯一成员)。

它已经在邮件列表上进行了彻底的审查,并且通常不会警告常规情况。


1
嗯,看起来这个警告选项是最近引入的。这些警告选项对于“Apple clang version 2.0”和Xcode 4.0.1(/Developer/usr/bin/clang等)中的gcc-4.2.1无效。我预计在Xcode 3.2中也是如此。但绝对是一个令人愉悦的功能。应该纳入到gcc中。 - Shigerello
@Shigerello:这是最近的事情,我甚至不确定它是否存在于最新的CLang版本(2.9)中。 - Matthieu M.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接