【问题标题】:In C how to define all unknow macros(used in source file/ header file) in command line [closed]在C中如何在命令行中定义所有未知的宏(在源文件/头文件中使用)[关闭]
【发布时间】:2014-01-28 06:56:16
【问题描述】:

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

$ gcc -H stdio.h

这适合我,你知道有 #define 可以有条件地包含基于 Macors 的其他一些头文件,现在我希望在命令行中传递这样的 #define,类似于

$ gcc -D* -H stdio.h

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

【问题讨论】:

  • 您要解决的实际问题是什么?
  • 我试图解决的问题在我的问题中非常具有描述性,我从 Mats Petersson 那里得到了答案。
  • 由于某些原因,我无法透露此要求的目的。这不是为了编译一些二进制文件,而是为了深入操作系统。
  • 我并不担心对我的问题投反对票,但由于某种原因,就像我之前所说的那样,我无法说出 为什么我想要这样的解决方案,但你读过在两行之间,您会得到我正在寻找的解决方案是什么。还有一件事,许多创新来自一些奇怪的要求和想法。

标签: c++ c gcc macros


【解决方案1】:

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

比如说你有:

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

原作者当然不希望您在同时启用 ARM 和 X86 的情况下编译它,因为这种组合根本没有任何意义。

即使你要定义所有的定义,你也不会明白第二部分:

#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 已定义,则它已包含在内”,您必须编写自己的代码以遵循具有不同定义的不同路径,包括“未设置”。

我可以看到,如果您没有明确的“我正在编译的环境是什么”,这将很快变得非常复杂。

【讨论】:

  • 嗨,我知道你的意思,我同意,事实上我在你说出来之前就知道了,但我的要求完全不同,不像其他一些平凡的项目,我想是不是有一些解决这个问题的方法,如果有人已经使用 gcc 完成/可用(部分像 -undef),无论如何感谢您确认这样的事情不可用
  • 我可以看到你来自哪里,但根据我的经验,你几乎肯定是“找错了树”。我编辑了我的答案以进一步涵盖“这会很奇怪”。如果你查看 glibc 的标准头文件,你会发现有很多不同的定义,它们可能适用于也可能不适用于特定的环境、系统、架构等。换句话说,“设置一切”不是一切都会好起来的。您需要了解在您的特定情况下会设置什么,不会设置什么。
【解决方案2】:

没有自动的方法来解析头文件并将#define-s 传递给编译器。有一个-D &lt;name&gt; 选项可用于定义预处理器名称。详情见这里:3.11 Options Controlling the Preprocessor

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多