【问题标题】:In compilation time how to find the macro is defined in which header file在编译时如何查找宏定义在哪个头文件中
【发布时间】:2016-06-17 08:37:38
【问题描述】:

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

在编译源代码时有什么选择吗?

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

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

【问题讨论】:

  • 你可以使用ctags。
  • 这不是一个真正的答案,除了一点点:大多数HAVE_XXX 将来自config.h,由 autoconfig 自动生成。
  • 搜索项目文件夹中的所有头文件。很可能它出现在自动生成的头文件中,这意味着头文件可能还不存在,并且带有宏的头文件将由configure 脚本(或类似脚本)创建。
  • 您能否告诉我们为什么您“需要知道宏在哪里”?您要解决的实际问题是什么? Related reading about the XY problem.
  • @Jaochim 那我怎么知道这个宏是否已经定义了?我也不能使用 printf 语句来检查这个宏是否被定义,因为在主函数之前只有他们声明了标题。

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


【解决方案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?

我希望这会有所帮助。

【讨论】:

    【解决方案2】:

    #warning 用于检查是否定义了宏。在函数中,我们可以使用 printf 来检查它是否启用。但是标题中的一些宏,我们不能使用 printf。所以我们可以使用#warning,否则我们可以使用#error

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

    【讨论】:

      猜你喜欢
      • 2012-09-30
      • 1970-01-01
      • 2016-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-26
      • 1970-01-01
      相关资源
      最近更新 更多