我的要求是以递归方式获取Header文件中包含的所有Header文件的列表,我正在使用,作为stdio.h上的示例
$ gcc -H stdio.h
哪个适合我,因为你知道有#define有条件地包含一些基于Macors的其他Header文件,现在我希望在命令行中传递这样的#define,比如
$ gcc -D * -H stdio.h
自动定义Header文件中使用的所有宏。我试过,但没有成功,任何想法,谢谢
答案 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变量。