gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 23:30:12 25 4
gpt4 key购买 nike

我需要通过我的头文件覆盖某些宏定义。而且我不允许更改源代码。而且我必须使用 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/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com