是否可以用宏包装函数调用?
当我尝试
时#define foo(x) bar(x)
它包含函数调用和定义。
我知道使用链接器包装函数,但在这种情况下我无法使用此解决方案。
让我们假设一些代码
#define foo(x) bar(z)
int foo(int z){
//some code
}
int bar(int x){
//some code
}
int function(){
int a = foo(2);
}
我想要int = foo(2);预处理后变为int a = bar(2)。 目前我只收到"重新定义"错误。
编辑:我的示例显示了我想要实现的内容,但我在实际代码中我必须通过cmake文件将此宏放入项目中,我也无法修改目标文件中的源代码。很抱歉没有提及它。
答案 0 :(得分:1)
使用undef来管理宏的生命周期,而不是使用不了解宏的代码部分。存在。
int foo(int z){
//some code
}
int bar(int x){
//some code
}
int function(){
#define foo(x) bar(z)
int a = foo(2);
#undef foo
}
这个技巧扩展到标题选项之类的东西,通常包括像Windows.h这样的东西,标题的定义依赖于标题外定义的定义,如下所示:
#define WIN32_LEAN_AND_MEAN // used in ifdef checks to not define/include rarely used stuff
#define NO_STRICT // used to allow HANDLE types to be used as void * without type errors
#define NO_MINMAX // used to avoid errors because MIN/MAX are already defined
#include <Windows.h>
这会在标头完成解析后使用宏没有用的污染范围,所以你可以在include之后通过取消它们进行清理:
#define WIN32_LEAN_AND_MEAN // used in ifdef checks to not define/include rarely used stuff
#define NO_STRICT // used to allow HANDLE types to be used as void * without type errors
#define NO_MINMAX // used to avoid errors because MIN/MAX are already defined
#include <Windows.h>
#undef NO_MINMAX
#undef NO_STRICT
#undef WIN32_LEAN_AND_MEAN
这使人们更容易阅读您的代码,特别是C的初学者,知道这些是选项,并且在包含发生后没有任何用处。这也允许你做一些有趣的C ++行为,比如基于include之前定义的定义的模板化,而不会多次包含头文件的冲突。
答案 1 :(得分:0)
不确定这是否是您想要的,但您可以尝试在函数声明后放置宏。所以
foo(...){}
bar(...){}
#ifdef REPLACE_FOO
#define foo(x) bar(x)
#endif
main(){
foo(1);
}
答案 2 :(得分:0)
那是因为预处理器不关心要替换哪个字符串。
它还会替换原始函数定义foo
,这意味着函数bar
被定义了两次。
你应该能够通过类似的东西来解决这个问题:
#if !defined(foo)
int foo(int z){
//some code
}
#endif
当然,这取决于你真正想做的事情。