我需要通过我的头文件覆盖某些宏定义。而且我不允许更改源代码。而且我必须使用 gcc,但如果有人知道任何其他编译器上有类似的东西,那么它也会有所帮助。
这是我真正需要的:
可以说我有很多 .c 文件的代码库。这些 .c 文件包括 .h 文件。在为每个文件包含所有 .h 文件之后,我希望编译器的行为就像我有另一个 extra.h
我要在调用编译器时指定的文件。我在那个 .h 文件中所做的是 #undef
一些宏并按照我想要的方式重新定义宏。
注意:我知道 --preinclude
gcc 中的选项,但使用 --preinclude
用原始源代码的 .h 覆盖我的 extra.h。我需要的是某种帖子包含选项。
最佳答案
除非您统一有一个始终包含在源文件最后的特定 header ,否则这将很棘手。
我认为,如果必须的话,我会采用的方法是:
headers
. #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
的确切位置目录。 -I
选项(例如 -I/usr
如果您使用了 #include "include/header.h"
符号)再次定位标准标题。 结果是编译器直接使用您的私有(private)头文件,但它们包括标准头文件,然后是您的
extra.h
。 header - 从而在不修改 C 源代码或普通 header 的情况下实现您想要的。但是整个尝试有些误导......你最好不要尝试这个。
关于gcc - 使用编译器选项覆盖宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4181490/