我希望能够获得C源文件中包含的所有可能文件的列表。
我知道其他#指令存在并发症(例如,#ifdef可以阻止包含或引起额外的包含)。我正在寻找的是一个可能包含的文件列表。
是否有工具可以做到这一点?
我正在编译的文件只是.o,标准C库不包括在内。我知道这听起来不错,但我们有理由。
我希望能够做到这一点的原因是我想要一个可能对.o有贡献的文件列表,所以我可以查看它们是否已经改变。
答案 0 :(得分:10)
引用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.
这基本上可以满足您的需求。有several other related options(均以-M
开头)为您提供此输出的不同变体。
答案 1 :(得分:2)
我的语法生锈了,但是......
grep -ir "#include " *.c
可能有用......
答案 2 :(得分:2)
如果您使用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"
答案 3 :(得分:1)
您只能执行预处理器步骤。大多数编译器都允许这样做。
当然,这需要一些繁忙的工作来阅读生成的文件。
答案 4 :(得分:1)
所有可能的文件?没办法那样做。
答案 5 :(得分:1)
唉,只是为了#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;
}
...虽然你可以通过检查判断出 #include precious 正在发生非标准的事情,因为缺少&lt;&gt;或“”。
一个非反常的例子是根据命令行定义将令牌粘贴到不同的库根目录。