我在源文件(* .c)中使用了一些宏。
在编译期间或从库中是否有任何方法可以确定从中解析此特定宏的确切头文件?
问题是我们在某些头文件中使用宏#defined为10,但代码中收到的值为4。因此,我们不想去检查所有dep文件,而是想知道有一些直接的方法来识别宏从中解析出来的源。
答案 0 :(得分:7)
如果你只是在文件上运行cpp(C预处理器),输出将包含表单的#line指令
#line 45 "silly-file-with-macros.h"
编译器说明所有内容的来源。所以一种方法是使用
cpp my-file.c | more
并查找#line
指令。
根据您的编译器,您可以使用的另一个技巧是将宏重新定义为其他内容,编译器将发出警告,如
test-eof.c:5:1: warning: "FRED" redefined
test-eof.c:3:1: warning: this is the location of the previous definition
(这是来自gcc),它应该告诉你之前定义宏的位置。但是想想看,你怎么没有得到那个警告呢?
另一个想法是使用makedepend
获取所有包含文件的列表,然后grep它们中的#define
行。
答案 1 :(得分:2)
grep for #define?
答案 2 :(得分:0)
find / -name '*.h' | xargs -L 100 grep -H macroname
那里有三个命令。 find命令选择要搜索的文件,以便您可以将其更改为“ .c”或“ .cpp”或您需要的任何内容。然后xargs命令一次将文件列表拆分为100,这样就不会溢出一些内部shell命令缓冲区大小。然后使用每个100个文件的列表重复运行grep命令,并打印包含macroname的任何文件名和使用它的代码行。
从这里你应该能够看到它被重新定义的位置。