在C中如何在命令行中定义所有未知宏(在源文件/头文件中使用)

时间:2014-01-28 06:56:17

标签: c++ c gcc macros

我的要求是以递归方式获取Header文件中包含的所有Header文件的列表,我正在使用,作为stdio.h上的示例

$ gcc -H stdio.h

哪个适合我,因为你知道有#define有条件地包含一些基于Macors的其他Header文件,现在我希望在命令行中传递这样的#define,比如

$ gcc -D * -H stdio.h

自动定义Header文件中使用的所有宏。我试过,但没有成功,任何想法,谢谢

2 个答案:

答案 0 :(得分:3)

这是不可能的,定义特定头文件使用的所有宏也没有任何意义。其中一些可能是相互排斥的。

比如说你有:

 #if ARCH_X86
     ... stuff goes here for x86... 
 #endif
 #if ARCH_ARM 
     .... stuff goes here for ARM ... 
 #endif

原作者CERTAINLY不希望您同时启用ARM和X86来编译它,因为这种组合根本没有任何意义。

即使你要定义ALL定义,你也不会理解第二部分:

#if ARCH_X86
   #include <x86_stuff.h>
#else
   #include <arm_stuff.h>
#endif

如果您的项目有特殊定义,那么请使用它们。但是所有定义都没有任何意义。

另一个问题是,您可能会发现与系统相关的文件,以及与之相关的定义,例如:

#ifdef WINDOWS
    #include <windows.h>
#elsif LINUX
    #include <linux.h>
#else
    #error "Must be either Linux or Windows". 
#endif

#if WINDOWS_THINGY_BOB
   ... do stuff here ... 
#endif

(假设WINDOWS_THINGY_BOB是通过包含windows.h设置的定义)

另一个潜在的问题是,不是所有东西都是“#ifdef”,而是类似这样的东西:

#if DEBUG==2
   #include <debug_lots.h>
#elsif DEBUG != 1
   #include <debug_little.h>
#else
   #include <no_debug.h>
#endif

如果你真的想看“如果定义了X,那就包含了这个”,你必须编写自己的代码来跟随不同的路径和不同的定义,包括“未设置”。

我可以看到,如果你没有一套明确的“我正在编译的环境是什么”,这将非常复杂。

答案 1 :(得分:0)

没有自动方法来解析头文件并将#define - s传递给编译器。有一个-D <name>选项可用于定义预处理程序名称。有关详细信息,请参阅此处:3.11 Options Controlling the Preprocessor

一个选项是创建一个makefile并使用要传递给编译器的标志定义CFLAGS变量。