有没有一个宏技巧可以在不影响函数定义的情况下只重命名函数调用,特别是针对gcc/cpp:
#define get_resolution __mock_get_resolution上面的宏会更改所有位置,但我只希望它在不影响定义void get_resolution()的情况下对函数调用get_resolution();生效
void get_resolution()
{
}
void display()
{
get_resolution();
}发布于 2012-08-01 23:36:50
不,C预处理器没有C程序结构的语义知识,它只看到文本标记。
一种选择是在定义之前对宏进行#undef,然后在定义之后重新定义它,但这很混乱。另一种选择是将宏添加到要模拟的每个函数的定义中,如下所示:
#if DO_MOCKING
#define IMPLEMENT_MOCKABLE_FUNCTION(funcname) _real_ ## funcname
#define get_resolution _mock_get_resolution
#else
#define IMPLEMENT_MOCKABLE_FUNCTION(funcname) funcname
#endif
...
void IMPLEMENT_MOCKABLE_FUNCTION(get_resolution)()
{
...
}还请注意,以两个下划线开头的标识符以及以下划线开头的标识符后跟大写字母,由实现保留(即编译器和标准库)。因此,我将上面示例中的标识符重命名为使用单个下划线和小写字母。
发布于 2012-08-01 23:45:30
作为gcc特有的解决方案,
The `alias' attribute causes the declaration to be emitted as an
alias for another symbol, which must be specified. For instance,
void __f () { /* Do something. */; }
void f () __attribute__ ((weak, alias ("__f")));发布于 2012-08-01 23:43:03
你可以这样做:
#define get_resolution __mock_get_resolution全局可访问的地方(如您始终包含的标题等)然后执行以下操作:
#undef get_resolution
void get_resolution()
{
}
#define get_resolution __mock_get_resolution
void display()
{
get_resolution();
}丑陋的hack,但它将使您不必编写sed(1)脚本。
测试用例如下:
$ gcc -o test test.c
$ ./test
__mock_up
$ cat test.c
#include <stdio.h>
#define get_resolution __mock_up
int
__mock_up()
{
printf("__mock_up\n");
}
#undef get_resolution
int
get_resolution()
{
}
#define get_resolution __mock_up
int main()
{
get_resolution();
return 0;
}
$ https://stackoverflow.com/questions/11762529
复制相似问题