可以包含哪些文件?

时间:2009-05-11 18:45:40

标签: c

我希望能够获得C源文件中包含的所有可能文件的列表。

我知道其他#指令存在并发症(例如,#ifdef可以阻止包含或引起额外的包含)。我正在寻找的是一个可能包含的文件列表。

是否有工具可以做到这一点?

我正在编译的文件只是.o,标准C库不包括在内。我知道这听起来不错,但我们有理由。

我希望能够做到这一点的原因是我想要一个可能对.o有贡献的文件列表,所以我可以查看它们是否已经改变。

6 个答案:

答案 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;或“”。

一个非反常的例子是根据命令行定义将令牌粘贴到不同的库根目录。