Есть ли способ определить, откуда Foo
, без grepping каждый #include
?Как определить, какой объект #include предоставляет какой объект?
#include "Baz.h"
#include "Quuz.h"
int main() {
Foo n;
}
Есть ли способ определить, откуда Foo
, без grepping каждый #include
?Как определить, какой объект #include предоставляет какой объект?
#include "Baz.h"
#include "Quuz.h"
int main() {
Foo n;
}
Я думаю, что самый простой способ также идиотский способ: определить его снова и получить ошибку
#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
Не портативный, но потрясающий! –
Принимая это ... благодаря тому, что я буду помнить эту технику на всю оставшуюся жизнь. – hoosierEE
Да. Предварительно обработать источник без его компиляции. С GCC или Clang это означает замену -c
-E
при компиляции (и, возможно, изменение имени выходного файла, переданного в -o
. Тогда у вас будет полный расширенный файл со всеми отмеченными #includes и может grep этот файл и посмотреть, куда входит Foo . от
... Который может быть файлом, включенным несколько раз, с разные посредники. Тем не менее, только документация предоставляет include-файлы, которые являются частью интерфейса библиотек, а также какие из них предоставляют контракт на этот контракт, а не только случайным образом. – Deduplicator
Лучше всего получить достойную среду IDE, и это должно решить намного проще. Visual Studio с VAssist неплохо. –
Вы можете использовать cscope:
Построить теги:
$ cscope -R
Затем выберите:
Find this global definition: Foo
Он покажет вам в какой файл (ы) Foo
определяется.
Зависит от вашей IDE. Или прочитайте документацию –
Рассмотрите возможность использования [ack] (http://beyondgrep.com/) вместо 'grep'. И у вас также есть [ctags] (http://en.wikipedia.org/wiki/Ctags). И [cedet] (http://cedet.sourceforge.net/index.php) для 'emacs' и т. Д. –
Кроме того,' Foo' может быть макросом или даже получен и объявлен макроразложением (см. [X -macros] (http://en.wikipedia.org/wiki/X_Macro) ..) .. Таким образом, нет общих безупречных решений .... –