2010-04-08 34 views
3

考虑下面的一小段代码:如何找出命名空间如何被污染?

// 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

尝试在每个#include声明后面放置string s;以找到不引起错误的第一个位置。这会告诉你哪个标题导致了问题。然后按照该头中的#include语句执行相同操作,依此类推。

有点手动过程,但不应该花太长时间。

+1

放置'string s;'时使用二进制搜索算法。它将采取“log(n)”步骤。 – 2010-04-08 18:40:41

+1

在每个'#include'之后放置一个不具有相同的渐近行为,但对于小n更好。我已经完成了这两种方式,但vim的交叉点通常比VS 2008更高。 – 2010-04-08 18:48:04

+0

N是头文件中的总行数。它可能非常大。 – 2010-04-08 18:57:02

6

无论如何grep可能是有用的。搜索“^使用命名空间”。有一个相当公平的机会,在一个函数内部它将被缩进,但在外部不会是......

5

编译器通常有可能给予预处理输出(-E是常见的),这也得到q #line行中的真实源代码行。

+0

与任何编辑器中的'grep'或搜索相结合,可能是最简单的方法...比打开数千个文件要容易得多! – 2010-04-09 08:20:05

2
$ g++ -E souce.cpp | less 

从小类型中/using ,然后从那里寻找前行,看起来像

# <file_name> <line_number> 

这是预处理程序如何讲述一些代码来自所以它能做的事源编译器向后工作正确地执行错误消息。