让我们看下面的代码,如果定义了宏HAVE_SYS_SELECT_H,那么它们包含了头文件。我需要知道宏在哪里?这就是定义宏的头文件。
在编译源代码时是否有任何选项?
有没有办法找到头文件?另外我想知道在编译时是否定义了宏
#ifdef HAVE_SYS_SELECT_H
#include <sys/select.h>
#endif
答案 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