开发者

How to find out how namespace got polluted?

Consider the following little piece of code:

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

This compiles, so 开发者_如何学编程obviously some of the recursively included header files has a

using namespace std;

somewhere. How would you go about finding out where that offending line of code is?

Just using grep on all header files won't really work because that statement is often used inside a function, where it is safe and won't pollute the rest of the code.


grep might be useful anyway. Do a search for "^using namespace". There's a pretty fair chance that inside a function it'll be indented, but outside it won't be...


Compilers usually have the possibility to give the preprocessed output (-E is common) which get also indication of true source line in q #line lines.


Try putting string s; after each #include statement to find the first place where it doesn't cause the error. This will show you which header is causing the problem. Then do the same with the #include statements inside that header, and so on.

A bit of a manual process, but it shouldn't take too long.


$ g++ -E souce.cpp | less

From within less type /using and then work backwards from there looking for the previous line that looks like

# <file_name> <line_number>

That's how the preprocessor tells the compiler what source some code came from so it can do error messages correctly.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜