在编译时如何查找宏定义在哪个头文件中

时间:2016-06-17 08:37:39

标签: c c-preprocessor open-source header-files ctags

让我们看下面的代码,如果定义了宏HAVE_SYS_SELECT_H,那么它们包含了头文件。我需要知道宏在哪里?这就是定义宏的头文件。

在编译源代码时是否有任何选项?

有没有办法找到头文件?另外我想知道在编译时是否定义了宏

#ifdef HAVE_SYS_SELECT_H
    #include <sys/select.h>
#endif

2 个答案:

答案 0 :(得分:1)

从您的问题标题中唯一的答案是编译器或详细编译(使用-v),并且它取决于编译器,您必须阅读编译器手册。
但是在编译之前有静态代码分析工具可以提供帮助, 考虑这个示例代码:
“mac.h”文件:

#define TEST 1
#define TEST_FILE __FILE__

“mac.c”文件:

#include <stdio.h>
#include <limits.h>
#include <stdint.h>

#include "mac.h"
#define DEBUG 1

int main()
{ 
#ifdef DEBUG
    printf("%s",TEST_FILE); // C:\tmp\mac.c
#endif
} 

预处理器在C中删除include伪指令,因此该示例代码的输出是“mac.c”文件的路径,例如。(“C:\ tmp \ mac.c”)。
所以我认为你的问题只有一个解决方案:
使用您的编辑器静态代码分析功能或工具,如:
http://clang-analyzer.llvm.org/

并看到:
How can I quickly search all included header files in a project for a specific function or macro?
How to quickly identify functions from header files?
How expensive it is for the compiler to process an include-guarded header?

我希望这会有所帮助。

答案 1 :(得分:1)

#warning用于检查是否定义了宏。在函数中,我们可以使用printf来检查它是否被启用。但是在头文件中有些宏,我们不能使用printf。所以我们可以使用#warning,否则我们可以使用#error

     #ifdef HAVE_SYS_SELECT_H
     #warning "defined" 
         #include <sys/select.h>
     #endif