2014-09-11 3 views
2

Есть ли способ определить, откуда Foo, без grepping каждый #include?Как определить, какой объект #include предоставляет какой объект?

#include "Baz.h" 
#include "Quuz.h" 

int main() { 
    Foo n; 
} 
+1

Зависит от вашей IDE. Или прочитайте документацию –

+0

Рассмотрите возможность использования [ack] (http://beyondgrep.com/) вместо 'grep'. И у вас также есть [ctags] (http://en.wikipedia.org/wiki/Ctags). И [cedet] (http://cedet.sourceforge.net/index.php) для 'emacs' и т. Д. –

+0

Кроме того,' Foo' может быть макросом или даже получен и объявлен макроразложением (см. [X -macros] (http://en.wikipedia.org/wiki/X_Macro) ..) .. Таким образом, нет общих безупречных решений .... –

ответ

6

Я думаю, что самый простой способ также идиотский способ: определить его снова и получить ошибку

#include <iostream> 
using namespace std; 

typedef int cout; //<--- just for test 

int main(){ 
    cout<<"Hi!"<<endl; 
    return 0; 
} 

Теперь при компиляции (с помощью GCC) у меня есть ошибки:

tt.cpp:8: error: reference to ‘cout’ is ambiguous 
tt.cpp:5: error: candidates are: typedef int cout 
/usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../include/c++/4.4.7/iostream:59: error: std::ostream std::cout 
+0

Не портативный, но потрясающий! –

+0

Принимая это ... благодаря тому, что я буду помнить эту технику на всю оставшуюся жизнь. – hoosierEE

3

Да. Предварительно обработать источник без его компиляции. С GCC или Clang это означает замену -c-E при компиляции (и, возможно, изменение имени выходного файла, переданного в -o. Тогда у вас будет полный расширенный файл со всеми отмеченными #includes и может grep этот файл и посмотреть, куда входит Foo . от

+1

... Который может быть файлом, включенным несколько раз, с разные посредники. Тем не менее, только документация предоставляет include-файлы, которые являются частью интерфейса библиотек, а также какие из них предоставляют контракт на этот контракт, а не только случайным образом. – Deduplicator

+1

Лучше всего получить достойную среду IDE, и это должно решить намного проще. Visual Studio с VAssist неплохо. –

1

Вы можете использовать cscope:

Построить теги:

$ cscope -R 

Затем выберите:

Find this global definition: Foo 

Он покажет вам в какой файл (ы) Foo определяется.

Смежные вопросы