2016-11-07 60 views
0

爲了減少行數來寫,我使用宏以下列方式:如何在包含C/C++宏的行尾添加語句?

#define FUNC(a, b) func(a, b, threadId, sizeof(a)); \ 
         do something 1;     \ 
         do something 2;  

這工作很好,因爲我只需要使用宏(2個參數)編碼函數調用(具有4個參數)和2個或更多其他語句。

此函數調用是另一個函數的參數時出現問題。 例如,假設我需要下面的代碼:

func1(par1, func(a, b, c, d)); 
do something 1; 
do something 2; 

有沒有辦法實現這個使用宏,或任何其他的選擇嗎? 即我期待這樣的:

func1(par1, FUNC(a, b)); //This statement(using macros) should transform into the above code after the preprocessing step. 
+7

即使是這樣,這將是一個可怕的想法國際海事組織,因爲它會使宏有奇怪的效果,不能立即看到程序員閱讀代碼。 – UnholySheep

+6

這不適合宏觀。我會用常規函數替換宏。 –

+2

你爲什麼試圖做這樣的事情有特別的理由嗎?這聽起來像一個典型的[XY問題](http://xyproblem.info/)給我。 –

回答

3

我仍然無法工作不敢肯定你是什麼實際上努力實現,但用這樣的:

#define FUNC(a, b) func(a, b, threadId, sizeof(a)); \ 
        do something 1;     \ 
        do something 2; 

本(假設ab參數的類型int):

int FUNC(int a, int b) 
{ 
    int returnvalue = func(a,b,threadId, sizeof(a)); 
    do something 1; 
    do something 2; 
    return returnvalue; 
} 

應該做這項工作。

+0

你的解決方案可以讓我在不使用宏的情況下表達我的問題中的第一個代碼塊。我能夠使用宏實現相同的功能,但是現在我明白了在沒有宏的情況下這樣做的好處。然而,問題是函數func被用作另一個函數中的參數,就像我的問題中的第二個代碼塊一樣。有沒有一種方法來表示它有或沒有宏? – ceedee

+0

您的宏解決方案被破壞,據我所知,沒有宏的解決方案。我的答案是否適合您的情況?如果不是,請告訴我爲什麼。 –

+0

它確實有效。我不確定這是否會工作,因爲函數func是我實現的庫的一部分,以及我的代碼中的其他功能。然而,它的工作,我想我被宏觀蒙上了一層陰影。非常感謝。 – ceedee

0

你可以嘗試代碼與支架分離{}。但是你的想法不是我會推薦的,因爲代碼變得很難理解和調試。

#define FUNC(a, b) { func(a, b, threadId, sizeof(a)); \ 
         do something 1;     \ 
         do something 2; } 

但是,如果你嘗試發送這個作爲參數傳遞給另一個函數,因爲你不返回任何東西是用途作爲一個參數(不ADRESS,沒有值)

+0

這不是一個答案,而是一個評論。你只是給出了使用'{}'的建議,但實際的問題仍然沒有答案。 –