如何找出命名空间如何被污染?

时间:2010-04-08 18:28:37

标签: c++ namespaces header-files unix

考虑以下一小段代码:

// all of these include other headers, lots of code:
#include "myheader1.h"
#include "myheader2.h"
#include <string>

void foo() {
  string s("hello world"); // oh no, why does this compile??
}

这个编译,显然一些递归包含的头文件有一个

using namespace std;

某处。您将如何找到违规代码行的位置?

在所有头文件上使用grep都不会真正起作用,因为该语句经常在里面一个函数中使用,它是安全的并且不会污染剩下的代码

4 个答案:

答案 0 :(得分:6)

无论如何,grep可能会有用。搜索“^ using namespace”。在一个函数里面有一个非常公平的机会它会缩进,但在它之外它不会......

答案 1 :(得分:5)

编译器通常可以给出预处理的输出(-E是常见的),它也可以在q #line行中指示真正的源行。

答案 2 :(得分:4)

尝试在每个string s;语句后面添加#include,以找到不会导致错误的第一个位置。这将显示导致问题的标头。然后对该标题内的#include语句执行相同操作,依此类推。

一些手动过程,但不应该花太长时间。

答案 3 :(得分:2)

$ g++ -E souce.cpp | less

从较少类型/using内 然后从那里向后工作,寻找看起来像

的上一行
# <file_name> <line_number>

这就是预处理器如何告诉编译器某些代码来自哪个源,因此它可以正确地执行错误消息。