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

C 在编译时,如何查找宏是在哪个头文件中定义的,c,c-preprocessor,open-source,header-files,ctags,C,C Preprocessor,Open Source,Header Files,Ctags,让我们看下面的代码,如果定义了宏HAVE_SYS_SELECT_H,则它们包含头文件。我需要知道宏在哪里?即定义宏的头文件 在编译源代码时是否有任何选项 有没有办法找到头文件?我还想知道编译时是否定义了宏 #ifdef HAVE_SYS_SELECT_H #include <sys/select.h> #endif #如果定义有系统选择# #包括 #恩迪夫 从您的问题标题中,唯一的答案是编译器或详细编译(使用-v),它依赖于编译器,您必须阅读编译器手册。 但是在编译之前,有

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

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

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

#ifdef HAVE_SYS_SELECT_H
    #include <sys/select.h>
#endif
#如果定义有系统选择#
#包括
#恩迪夫

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

“mac.c”文件:

#包括
#包括
#包括
#包括“mac.h”
#定义调试1
int main()
{ 
#ifdef调试
printf(“%s”,测试文件);//C:\tmp\mac.C
#恩迪夫
} 
预处理器删除C中的include指令,因此此示例代码的输出是指向“mac.C”文件的路径,例如(“C:\tmp\mac.C”)。
所以我认为对你的问题只有一个解决办法:
使用编辑器的静态代码分析功能或工具,如:

请参见:


我希望这有帮助。

#警告用于检查宏是否已定义。在函数中,我们可以使用printf检查它是否被启用。但是有些宏在标题中,我们不能使用printf。因此,我们可以使用“警告”或“错误”

#如果定义有系统选择#
#警告“已定义”
#包括
#恩迪夫

你可以使用CTAG。这不是一个真正的答案,也许有一点除外:大多数
都有XXX
将来自
config.h
,由autoconfig自动生成。搜索项目文件夹中的所有头文件。很可能是自动生成的头文件,这意味着头文件可能还不存在,头文件及其宏将由
configure
脚本(或类似脚本)创建。您还可以告诉我们为什么“需要知道宏在哪里”?你想解决的实际问题是什么@Jaochim那么我如何知道这个宏是否已经定义?此外,我不能使用printf语句检查宏是否定义,因为在main函数之前,只有它们声明了头。
#define TEST 1
#define TEST_FILE __FILE__
#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
} 
     #ifdef HAVE_SYS_SELECT_H
     #warning "defined" 
         #include <sys/select.h>
     #endif