首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于选择性替换的C宏技巧

用于选择性替换的C宏技巧
EN

Stack Overflow用户
提问于 2012-08-01 23:27:48
回答 3查看 781关注 0票数 1

有没有一个宏技巧可以在不影响函数定义的情况下只重命名函数调用,特别是针对gcc/cpp:

代码语言:javascript
复制
#define get_resolution __mock_get_resolution

上面的宏会更改所有位置,但我只希望它在不影响定义void get_resolution()的情况下对函数调用get_resolution();生效

代码语言:javascript
复制
void get_resolution()
{
}

void display()
{
    get_resolution();
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-08-01 23:36:50

不,C预处理器没有C程序结构的语义知识,它只看到文本标记。

一种选择是在定义之前对宏进行#undef,然后在定义之后重新定义它,但这很混乱。另一种选择是将宏添加到要模拟的每个函数的定义中,如下所示:

代码语言:javascript
复制
#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)()
{
    ...
}

还请注意,以两个下划线开头的标识符以及以下划线开头的标识符后跟大写字母,由实现保留(即编译器和标准库)。因此,我将上面示例中的标识符重命名为使用单个下划线和小写字母。

票数 2
EN

Stack Overflow用户

发布于 2012-08-01 23:45:30

作为gcc特有的解决方案,

代码语言:javascript
复制
 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")));
票数 3
EN

Stack Overflow用户

发布于 2012-08-01 23:43:03

你可以这样做:

代码语言:javascript
复制
#define get_resolution __mock_get_resolution

全局可访问的地方(如您始终包含的标题等)然后执行以下操作:

代码语言:javascript
复制
#undef get_resolution
void get_resolution()
{
}
#define get_resolution __mock_get_resolution

void display()
{
    get_resolution();
}

丑陋的hack,但它将使您不必编写sed(1)脚本。

测试用例如下:

代码语言:javascript
复制
$ 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;
}
$ 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11762529

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档