Какие файлы могли быть включены? - PullRequest
2 голосов
/ 11 мая 2009

Я хотел бы иметь возможность получить список всех возможных файлов, включенных в исходный файл C.

Я понимаю, что есть сложности с другими директивами # (например, #ifdef может либо предотвратить включение, либо вызвать дополнительное включение). Все, что я ищу, - это список файлов, которые могли быть включены.

Есть ли инструмент, который уже делает это?

Файлы, которые я собираю, собираются только в .o, и стандартные библиотеки C не включены. Я знаю, это звучит странно, но у нас есть свои причины.

Причина, по которой я хочу это сделать, заключается в том, что я хочу иметь список файлов, которые могли что-то внести в .o, поэтому я могу проверить, изменились ли они.

Ответы [ 6 ]

10 голосов
/ 11 мая 2009

Цитирование справочной страницы для gcc:

-M  Instead of outputting the result of preprocessing, output a rule
    suitable for make describing the dependencies of the main source
    file.  The preprocessor outputs one make rule containing the object
    file name for that source file, a colon, and the names of all the
    included files, including those coming from -include or -imacros
    command line options.

Это в основном то, что вы хотите. Есть несколько других связанных параметров (все начинаются с -M), которые предоставляют вам различные варианты этого вывода.

2 голосов
/ 11 мая 2009

Если вы используете gcc, вы можете проверить дамп препроцессора:

[~]> gcc -E /usr/include/cups/dir.h|grep "#"
# 1 "/usr/include/cups/dir.h"
# 1 "<built-in>"
# 1 "<command line>"
# 1 "/usr/include/cups/dir.h"
# 26 "/usr/include/cups/dir.h"
# 1 "/usr/include/sys/stat.h" 1 3 4
# 73 "/usr/include/sys/stat.h" 3 4
# 1 "/usr/include/sys/_types.h" 1 3 4
# 32 "/usr/include/sys/_types.h" 3 4
# 1 "/usr/include/sys/cdefs.h" 1 3 4
# 33 "/usr/include/sys/_types.h" 2 3 4
# 1 "/usr/include/machine/_types.h" 1 3 4
# 34 "/usr/include/machine/_types.h" 3 4
# 1 "/usr/include/i386/_types.h" 1 3 4
# 37 "/usr/include/i386/_types.h" 3 4
# 70 "/usr/include/i386/_types.h" 3 4
# 35 "/usr/include/machine/_types.h" 2 3 4
# 34 "/usr/include/sys/_types.h" 2 3 4
# 58 "/usr/include/sys/_types.h" 3 4
# 94 "/usr/include/sys/_types.h" 3 4
# 74 "/usr/include/sys/stat.h" 2 3 4
# 1 "/usr/include/sys/_structs.h" 1 3 4
# 88 "/usr/include/sys/_structs.h" 3 4
# 79 "/usr/include/sys/stat.h" 2 3 4
# 152 "/usr/include/sys/stat.h" 3 4
# 228 "/usr/include/sys/stat.h" 3 4
# 248 "/usr/include/sys/stat.h" 3 4
# 422 "/usr/include/sys/stat.h" 3 4
# 27 "/usr/include/cups/dir.h" 2
# 42 "/usr/include/cups/dir.h"
2 голосов
/ 11 мая 2009

мой синтаксис ржавый, но ...

grep -ir "#include " *.c

может работать ...

1 голос
/ 11 мая 2009

Увы, простого поиска источника для #include не гарантируется, потому что кто-то, возможно, совершил ...

#define tricksy(foo,bar) <foo##bar>
#define precious tricksy(ios, tream)
#include precious
int main(int, char **)
{
        std::cout << "Hobbits!" << std::endl;
        return 0;
}

... хотя вы могли бы осмотреть, что что-то нестандартное с # включает драгоценный из-за отсутствия <> или "".

Не неверный пример - вставка токенов различных корневых каталогов библиотеки в зависимости от определений командной строки.

1 голос
/ 11 мая 2009

Все ВОЗМОЖНЫЕ файлы? Нет способа сделать это.

1 голос
/ 11 мая 2009

Вы можете сделать только шаг препроцессора. Большинство компиляторов позволяют это.

Конечно, это потребовало бы некоторого занятого чтения конечного файла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...