2009-10-21 45 views
0

我在我的源文件(* .c)中使用了一些宏。确定确切的头文件

在编译过程中还是从库中,我可以识别出这个特定的宏正在解析的确切的头文件是否有任何方法?

问题是我们在一些头文件中使用宏#defined为10,但在代码中接收的值是4。因此,我们不想检查所有dep文件,而是想知道是否有一些直接的方法来确定宏解决的来源。

+1

为什么不运行简单搜索或grep? – Naveen 2009-10-21 14:06:17

回答

7

如果你只是在文件中运行CPP(C预处理器),输出将包含形式

#line 45 "silly-file-with-macros.h" 

的#line指令编译器说,这里的一切是从哪里来的。因此,一种方法是使用

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线在其中。

+0

这是正确的答案 – 2009-10-21 14:11:52

+0

答案的第一部分的问题是,预处理文件会删除所有'#define'指令和所有使用'MACRONAME'的实例(这就是预处理器的作用),所以没有任何东西为grep。但技巧2是非常有效的。 – 2009-10-21 14:29:04

+0

你是对的,宏将不复存在。我应该先测试一下! – 2009-10-21 14:36:01

2

grep for #define?

+0

与此问题是什么文件grep。如果使用“makedepend”,可以获得完整的依赖列表,然后将其作为参数提供给grep。 – 2009-10-21 14:20:18

+0

您项目中的所有文件。如果它不在那里,那么你就重新定义了你不应该触及的东西。 – Marcin 2009-10-21 14:23:11

+0

虽然这不是问题所在,但是追查那些本来不应该被重新定义的东西? – 2009-10-21 14:29:09

0
find/-name '*.h' | xargs -L 100 grep -H macroname 

这里有三个命令。 find命令会选择要搜索的文件,以便将其更改为'.c'或' .cpp'或您需要的任何文件。然后,xargs命令将文件列表一次拆分为100个,这样就不会溢出一些内部shell命令缓冲区大小。然后,grep命令重复运行,每个列表包含100个文件,并打印包含macroname和使用它的代码行的所有文件名。

由此你应该能够看到它被重新定义的位置。

+0

如果它在系统中定义,则不包括 – 2009-10-21 14:10:58

+0

由于您正在搜索可能未包含在文件中的文件,因此这并没有什么意义。 – 2009-10-21 14:11:15