我在C中有一个项目需要修改和运行。在某些时候,我有一个源文件
#ifndef THE_FLAG
// declare important stuff
#endif
但是,我不知道THE_FLAG
来自哪里#include
。在我的项目中定义 not ,它隐藏在外部库中。
我尝试了gcc -M
,但它显示了标题,如果它直接包含在包含层次结构中的某个位置,则显示标题。
项目太复杂,无法手动跟踪所有依赖项。它是使用./configure && make
构建的。
问题:如何跟踪此外部依赖项?
答案 0 :(得分:4)
尝试使用gcc -E
进行编译。这将告诉gcc在预处理阶段停止。作为其中的一部分,它会告诉您所有#define
来自何处。
请注意,这将创建一个文本文件,而不是.o
文件。
答案 1 :(得分: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;
^
答案 2 :(得分: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