【发布时间】:2018-02-08 16:50:26
【问题描述】:
是否可以只用宏包装函数调用?
当我尝试时
#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 a = foo(2);预处理后变为 int a = bar(2)。 目前我只收到“重新定义”错误。
编辑:我的示例显示了我想要实现的目标,但是在实际代码中我必须通过 cmake 文件将此宏放入项目中,并且我也无法修改目标文件中的源代码。很抱歉之前没有提及。
【问题讨论】:
-
it wraps both function call and definition-- 什么?它所做的只是用bar(x)替换字符串foo(x)。预处理器不处理定义,那是在编译阶段。 -
您能更具体地说明您想要实现的目标吗?
-
如果你想在某个地方禁止宏扩展,你只需要将宏放在括号中,例如
int (foo)(void)。 -
预处理器处理文本,它对 C 语法或语义一无所知。当它看到
foo后跟括号时,它会替换它。 -
@JensGustedt looking at question history,我猜这是为了使用外部单元测试文件中定义的备用存根来隐藏函数调用?对吗?
标签: c c-preprocessor