1

是否有一个宏技巧来重命名函数调用而不影响函数定义,特别是对于 gcc/cpp:

#define get_resolution __mock_get_resolution

上面的宏改变了所有的地方,但是我只是想让这个对函数调用生效get_resolution();而不影响定义void get_resolution()

void get_resolution()
{
}

void display()
{
    get_resolution();
}
4

3 回答 3

3

作为 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-01T15:45:29.910 回答
2

不,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-01T15:36:50.283 回答
0

你可以这样做:

#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;
}
$ 
于 2012-08-01T15:43:02.603 回答