用宏包裹函数调用

时间:2018-02-08 16:50:26

标签: c c-preprocessor

是否可以用宏包装函数调用?

当我尝试

#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文件将此宏放入项目中,我也无法修改目标文件中的源代码。很抱歉没有提及它。

3 个答案:

答案 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

当然,这取决于你真正想做的事情。