在现有 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
内部有一个宏,它广泛存在于 X
和 Y
的代码中
#define FOO() printf("Hello World\n")
我想改成
#define FOO() printf("===> Hello World <===")
现在,我知道在我的代码中,X
,我可以:
#ifdef FOO
#undef FOO
#define FOO() printf("===> Hello World <===")
#endif
这对 X
工作正常,但对 Y
中的任何代码和编译没有帮助。我可以在本地修改 Y
或 L
的代码,但是我无法检查我的修改,因为它可能会破坏其他项目对 FOO
所做的事情的期望。
是否可以通过命令行修改宏,有点像-D
一样徒劳?如果是这样,那么我可以更改我的 Makefile 中的行为,任何签出 X
的人都可以访问改进后的 FOO
。使用-D
的问题是它会在X
和Y
#include
L的宏之前定义宏函数,然后导致宏重新定义警告(随后不是我想要的宏)。
除了在构建文件之前操作 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 编译器标志中。
-include file
: 处理文件就好像#include "file" 出现在主源文件的第一行。
如果您使用其他编译器,标志可能会有所不同。
假设我有一些代码如下:
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
内部有一个宏,它广泛存在于 X
和 Y
#define FOO() printf("Hello World\n")
我想改成
#define FOO() printf("===> Hello World <===")
现在,我知道在我的代码中,X
,我可以:
#ifdef FOO
#undef FOO
#define FOO() printf("===> Hello World <===")
#endif
这对 X
工作正常,但对 Y
中的任何代码和编译没有帮助。我可以在本地修改 Y
或 L
的代码,但是我无法检查我的修改,因为它可能会破坏其他项目对 FOO
所做的事情的期望。
是否可以通过命令行修改宏,有点像-D
一样徒劳?如果是这样,那么我可以更改我的 Makefile 中的行为,任何签出 X
的人都可以访问改进后的 FOO
。使用-D
的问题是它会在X
和Y
#include
L的宏之前定义宏函数,然后导致宏重新定义警告(随后不是我想要的宏)。
除了在构建文件之前操作 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 编译器标志中。
-include file
: 处理文件就好像#include "file" 出现在主源文件的第一行。
如果您使用其他编译器,标志可能会有所不同。