在现有 C 库中重新定义宏

Redefine Macro in existing C library

假设我有一些代码如下:

L - A common library (source) (via svn:extern)
X - My project
Y - A static library (source) (via svn:extern) compiled with X and depends on L

L 内部有一个宏,它广泛存在于 XY

的代码中
#define FOO() printf("Hello World\n")

我想改成

#define FOO() printf("===> Hello World <===")

现在,我知道在我的代码中,X,我可以:

#ifdef FOO
    #undef FOO
    #define FOO() printf("===> Hello World <===")
#endif

这对 X 工作正常,但对 Y 中的任何代码和编译没有帮助。我可以在本地修改 YL 的代码,但是我无法检查我的修改,因为它可能会破坏其他项目对 FOO 所做的事情的期望。

是否可以通过命令行修改宏,有点像-D一样徒劳?如果是这样,那么我可以更改我的 Makefile 中的行为,任何签出 X 的人都可以访问改进后的 FOO。使用-D的问题是它会在XY#includeL的宏之前定义宏函数,然后导致宏重新定义警告(随后不是我想要的宏)。

除了在构建文件之前操作 Y 文件(比如附加您编写的代码)之外,我没有其他方法可以做到这一点。

这真的非常简单,可以通过 make 命令将您的文件变成 Y_modified.cpp,然后让所有构建使用修改后的版本。这样您就可以将它们视为构建了一半的文件,并获得增量构建的所有好处。

单个 Y.cpp 包括 L.h 将变成一个 t运行slation 单元,在预处理器具有 运行 之后,您无法真正向其中注入任何东西。

我认为最好的整体修复是修改 L 中的定义,如下所示:

#ifndef FOO
  #define FOO() printf("Hello World\n")
#endif

您可以在不破坏任何其他人的代码的情况下签入此更改,然后很容易从命令行或 makefile 中覆盖 FOO 的定义。

假设L使用header guards, 你可以做类似

的事情

l_improved.h

#ifndef L_IMPROVED_H
#define L_IMPROVED_H

#include "L.h"

#ifdef FOO
    #undef FOO
    #define FOO() printf("===> Hello World <===");
#endif

#endif

然后添加:

-include l_improved.h

在你的 gcc 编译器标志中。

来自gcc Preprocessor-Options

-include file: 处理文件就好像#include "file" 出现在主源文件的第一行。

如果您使用其他编译器,标志可能会有所不同。