2013-01-08 17 views
2

我在C中有一个需要修改和运行的项目。在某些时候,在源文件中我有检查一个常量是从一个大的C项目中包含的

#ifndef THE_FLAG 
// declare important stuff 
#endif 

,但我不知道在哪里THE_FLAG#include d。这是我的项目中定义的而不是,它隐藏在外部库的某处。

我试图gcc -M但它显示了头,没有信息,如果它直接或包括层次较高的地方包括。

项目太复杂跟踪用手所有依赖。它是用./configure && make构建的。

问题:如何跟踪这个外部的依赖?

+0

难道真的THE_FLAG,还是你只是把它作为一个例子吗?如果这个名称足够独特,那么我只需要在系统上grep所有头文件。 – Chris

+0

只是示例:) –

回答

4

尝试gcc -E编译。这将告诉gcc停止在预处理阶段。作为其中的一部分,它会告诉你所有#define是从哪里来的。

注意这将创建一个文本文件,而不是一个.o文件。

0

gcc -E会给我们预处理后的输出。但有时开发人员很难验证.c文件是否非常大,并且包含一些大的头文件。在这种情况下,检查构建输出会更容易。 #warning将在编译期间将该消息打印为警告。

#ifndef THE_FLAG 
#warning "including ABC stuff" 
// declare important stuff 
#endif 

我们可以使用#pragma还编译器警告,但独立它不是平台。

#pragma "including ABC stuff" 

如果我们要停止编译如果一些不需要的宏已定义的地方,我们可以使用#error

#ifdef UNWANTED_FLAG 
#error "Build stopped. UNWANTED flag has been defined" 
#endif 
+0

这只会告诉你该标志已被定​​义,但它不会告诉你它在哪里定义。 –

+0

@NathanFellman每次我们可能都不需要从它定义的地方找到它。大多数时候我们需要知道它的定义与否。我也考虑过这种情况。 – rashok

+0

对于另一个问题,你是一个很好的答案。它没有回答OP的问题。 –

2

您可以让gcc通过重新定义标志来确定标志在哪里定义以用于测试目的。

#include <limits.h> 

#define INT_MAX 42 

int f(void) 
{ 
     return INT_MAX; 
} 

将使GCC抱怨

main.c:4:0: warning: "INT_MAX" redefined [enabled by default] 
#define INT_MAX 42 
^ 
In file included from main.c:2:0: 
/usr/lib/gcc/x86_64-redhat-linux/4.8.1/include/limits.h:120:0: note: this is the location of the previous definition 
#define INT_MAX __INT_MAX__ 
^ 

同样的策略也很适合的情况下,寻找结构定义(非常有用的,你有几个建筑师特定的头文件,你不知道哪一个实际上是使用!)。

#include <stdio.h> 

typedef void FILE; 

void f(void) 
{ 
} 

main.c:3:14: error: conflicting types for ‘FILE’ 
typedef void FILE; 
      ^
In file included from main.c:1:0: 
/usr/include/stdio.h:48:25: note: previous declaration of ‘FILE’ was here 
typedef struct _IO_FILE FILE; 
         ^
相关问题