2012-08-01 98 views
1

是否有宏招重命名,而不會影響函數的定義只是函數調用,專爲GCC/CPP:選擇性C代碼宏招取代

#define get_resolution __mock_get_resolution 

上面的宏改變了所有的地方,但我只是想這個承擔函數調用get_resolution();效果,而不會影響清晰度void get_resolution()

void get_resolution() 
{ 
} 

void display() 
{ 
    get_resolution(); 
} 

回答

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)() 
{ 
    ... 
} 

另外請注意,有兩個下劃線,以及標識開始的名稱開頭的下劃線跟着一個大寫字母,由實現保留(即編譯器和標準庫)。所以我在上面的例子中重新命名了標識符,使用一個下劃線和一個小寫字母。

0

你可以做這樣的事情:

#define get_resolution __mock_get_resolution 

地方全局訪問(例如標題,你總是包含等),然後執行以下操作:

#undef get_resolution 
void get_resolution() 
{ 
} 
#define get_resolution __mock_get_resolution 

void display() 
{ 
    get_resolution(); 
} 

醜陋的黑客攻擊,而且可以節省你必須寫一個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; 
} 
$ 
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")));