我有以下代碼宏和函數同名
#define myfunc(a,b) myfunc(do_a(a), do_b(b))
void myfunc(int a, int b)
{
do_blah(a,b);
}
int main()
{
int x = 6, y = 7;
myfunc(x,y);
return 0;
}
我想預處理器僅在調用擴展功能MYFUNC。預處理後所需的代碼看起來是這樣的:
void myfunc(int a, int b)
{
do_blah(a,b);
}
int main()
{
int x = 6, y = 7;
myfunc(do_a(x),do_b(y));
return 0;
}
的問題是,函數定義也擴大這樣
void myfunc(do_a(int a), do_b(int b))
{
do_blah(a,b);
}
有沒有什麼辦法讓宏展開,只有當我們正在擴大功能呼叫? 我嘗試了許多解決方案,它似乎是不可能的,但我希望有人見過這樣的情況..
注:請不要告訴我重新命名宏或函數名:d
UPDATE1: 感謝您的幫助。但是我只能改變宏的定義,我不能改變它的位置,我不能改變函數的實現。
它的工作原理:) 謝謝 – Yousf 2009-12-23 13:57:56
我認爲一些預處理器可能會妨礙myfunc(xxx,xxx)形式的遞歸使用。我會做 的#define MYFUNC(A,B)(MYFUNC)(do_a(一),do_b(B)) INT(MYFUNC)(INT A,INT B) &C – 2009-12-23 17:39:39
好一點,蒂姆,謝謝!但我認爲假定預處理器永遠不會進入遞歸循環是安全的(參見標準6.10.3.4/2「...如果任何嵌套替換遇到被替換的宏的名稱,它不會被替換...」)。 – pmg 2009-12-23 18:11:31