gcc - 使用编译器选项覆盖宏

标签 gcc c-preprocessor

我需要通过我的头文件覆盖某些宏定义。而且我不允许更改源代码。而且我必须使用 gcc,但如果有人知道任何其他编译器上有类似的东西,那么它也会有所帮助。

这是我真正需要的:

可以说我有很多 .c 文件的代码库。这些 .c 文件包括 .h 文件。在为每个文件包含所有 .h 文件之后,我希望编译器的行为就像我有另一个 extra.h我要在调用编译器时指定的文件。我在那个 .h 文件中所做的是 #undef一些宏并按照我想要的方式重新定义宏。

注意:我知道 --preinclude gcc 中的选项,但使用 --preinclude用原始源代码的 .h 覆盖我的 extra.h。我需要的是某种帖子包含选项。

最佳答案

除非您统一有一个始终包含在源文件最后的特定 header ,否则这将很棘手。

我认为,如果必须的话,我会采用的方法是:

  • 创建一个新目录,命名为headers .
  • 放入与常规 header 同名的合适的虚拟 header ,其中包含 #include "extra.h"最后(或者可能 #include <extra.h> ,但我会尽量避免这种情况)。
  • 虚拟头文件也会通过某种机制包含原始文件,甚至可能使用#include "/usr/include/header.h"。但最好是其他一些技术 - 例如#include "include/header." .
  • extra.h header 总是会重新定义它的所有宏 - 它不会有正常的 #ifndef EXTRA_H_INCLUDED/#define EXTRA_H_INCLUDED/#endif多个包含守卫,这样每次被包含时,都会重新定义相关的宏。
  • 因此,extra.h不能定义任何类型。 (或者,更准确地说,如果确实如此,则必须通过多个包含保护来保护它们免受多重定义;关键是每次包含文件时都必须定义宏 - 有点像 <assert.h>。)
  • 每个重新定义的宏都将受到 #undef REDEFINED_MACRO 的显式保护。然后 #define REDEFINED_MACRO ... .
  • 在取消定义之前测试宏是否已定义是没有意义的。
  • 构建过程将被修改为查看 headers在查看其他任何地方之前的目录。编译器选项将是 -I./headers或类似的东西,具体取决于您找到 headers 的确切位置目录。
  • 根据您决定如何定位正常版本的 header ,您可能需要另一个 -I选项(例如 -I/usr 如果您使用了 #include "include/header.h" 符号)再次定位标准标题。

  • 结果是编译器直接使用您的私有(private)头文件,但它们包括标准头文件,然后是您的extra.h。 header - 从而在不修改 C 源代码或普通 header 的情况下实现您想要的。

    但是整个尝试有些误导......你最好不要尝试这个。

    关于gcc - 使用编译器选项覆盖宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4181490/

    相关文章:

    macos - 未链接的 clang - 编译器错误 (MacOS)

    gcc - 当在内联汇编中编译 inb 和 outb 时产生 "Error: operand type mismatch"

    c++ - 如何 #define 多个值 C/C++

    c++ - 在 C 和 C++ 中解析 typedef

    c++ - #ifdef 与 #if - 作为启用/禁用特定代码部分编译的方法,哪个更好/更安全?

    c - 通用结构的 token 粘贴

    c++ - 了解使用 GCC 时编译时间花在哪里

    c++ - 编译一个静态二进制文件,其中代码有一个函数 gethostbyname

    c - 冒泡排序程序,适用于 DM 编译器(在 Windows 上)而不适用于 GCC(Ubuntu)

    c++ - 当 X 未定义时,为什么没有 "#if X"警告?