C 可能包含哪些文件?

C 可能包含哪些文件?,c,C,我希望能够得到一个C源文件中包含的所有可能文件的列表 我知道其他指令(例如,#ifdef可能会阻止包含或导致额外的包含)会带来复杂性。我要找的是一个可能包含的文件列表 有没有一个工具已经做到了这一点 我正在编译的文件只指向.o,标准C库不包括在内。我知道这听起来不可靠,但我们有我们的理由 我希望能够这样做的原因是我希望有一个可能对.o有贡献的文件列表,以便检查它们是否已更改。您只能执行预处理器步骤。大多数编译器都允许这样做 当然,这需要一些繁忙的工作来读取结果文件。所有可能的文件?没办法。我的语

我希望能够得到一个C源文件中包含的所有可能文件的列表

我知道其他指令(例如,#ifdef可能会阻止包含或导致额外的包含)会带来复杂性。我要找的是一个可能包含的文件列表

有没有一个工具已经做到了这一点


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


我希望能够这样做的原因是我希望有一个可能对.o有贡献的文件列表,以便检查它们是否已更改。

您只能执行预处理器步骤。大多数编译器都允许这样做


当然,这需要一些繁忙的工作来读取结果文件。

所有可能的文件?没办法。我的语法已经过时了,但是

grep -ir "#include " *.c

可能有效…

如果使用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"
gcc-E/usr/include/cups/dir.h|grep“ #1“/usr/include/cups/dir.h” # 1 "" # 1 "" #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”
引用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
开头)为您提供了此输出的不同变体。

唉,仅仅将源代码变为#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;
}
#定义诡计(foo,bar)
#定义宝贵的技巧(ios、Stream)
#包括珍贵的
int main(int,char**)
{

std::我可以假设您指的是标准C库吗?cpp-xc-dI main.C | egrep'#[0-9]+“[^”]*“[0-9]*”| egrep-o'[^”]*“| sort-u@litb,那是哪种编译器?它是GNUC预处理器。与gcc-dI一起工作也很好(也许最好使用它,这样它可以插入一些额外的宏)我正在编译的文件只会指向.o,而标准C库不包括在内。我知道这听起来有点不确定,但我们有我们的理由。我希望能够做到这一点的原因是我希望有一个可能对.o有所贡献的文件列表,这样我就可以检查它们是否发生了变化。我喜欢使用gcc的preprocessor(-E),但除非我确定我定义了或-D了所有可能的定义,否则这不会遗漏包含在#ifdef块中的文件吗?我想他的意思是“如果去掉条件指令,将包含的所有文件”。而不是“如果我决定为它们写一个#include行,则可能包含的任何文件。”谢谢!有没有一种方法可以让所有的“包含行”都计算在内,即使“ifdef”会删除它?如果你想要包含在“包含”中的所有内容,不管它是否真的包含在内,你可能最好使用“grep”。使用grep搜索所有的-P'\\包含“*”这很容易,但这不会处理自己包含的包含文件。要处理这一点,“一行”似乎会变得相当复杂。您可以复制源代码树,删除所有#(如果|否则|结束)行,然后用gcc-MG处理结果……预处理器转储的问题是,它向您显示了gcc的特定调用所包含的内容;如果您定义了“magic”,它将不会显示这些内容在命令行中,可能会包含一组完全不同的文件。这可能是我问题的一般解决方案的一个问题,但我确信没有人会疯狂到对我正在处理的源代码执行类似操作。对源代码进行grepping的问题是,我想知道包含的所有文件,即使是从我的源代码中包含的文件包括。+1,用于识别可能的,即使只是轻微的似是而非的边缘情况。尽管如此,我现在很想使用这样的技巧。。。