考虑以下一小段代码:
// 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
都不会真正起作用,因为该语句经常在里面一个函数中使用,它是安全的并且不会污染剩下的代码
答案 0 :(得分:6)
答案 1 :(得分:5)
编译器通常可以给出预处理的输出(-E是常见的),它也可以在q #line
行中指示真正的源行。
答案 2 :(得分:4)
尝试在每个string s;
语句后面添加#include
,以找到不会导致错误的第一个位置。这将显示导致问题的标头。然后对该标题内的#include
语句执行相同操作,依此类推。
一些手动过程,但不应该花太长时间。
答案 3 :(得分:2)
$ g++ -E souce.cpp | less
从较少类型/using
内
然后从那里向后工作,寻找看起来像
# <file_name> <line_number>
这就是预处理器如何告诉编译器某些代码来自哪个源,因此它可以正确地执行错误消息。