Как узнать, как загрязнено пространство имен? - PullRequest
3 голосов
/ 08 апреля 2010

Рассмотрим следующий маленький кусочек кода:

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

6 голосов
/ 08 апреля 2010

grep может быть полезен в любом случае. Выполните поиск «^ используя пространство имен». Весьма вероятно, что внутри функции он будет иметь отступ, но снаружи он не будет ...

5 голосов
/ 08 апреля 2010

Компиляторы обычно имеют возможность выдавать предварительно обработанные выходные данные (-E является обычным), которые также показывают истинную исходную строку в q #line строках.

3 голосов
/ 08 апреля 2010

Попробуйте поставить string s; после каждого оператора #include, чтобы найти первое место, где оно не вызывает ошибку. Это покажет вам, какой заголовок вызывает проблему. Затем сделайте то же самое с операторами #include внутри этого заголовка и т. Д.

Немного ручного процесса, но это не должно занять слишком много времени.

2 голосов
/ 08 апреля 2010
$ g++ -E souce.cpp | less

Изнутри меньше типа /using и затем работайте в обратном направлении, ища предыдущую строку, которая выглядит как

# <file_name> <line_number>

Именно так препроцессор сообщает компилятору, из какого источника был получен некоторый код, чтобы он мог правильно выводить сообщения об ошибках.

...