2017-01-27 69 views
0

在我的代碼使用預處理宏預處理宏調用內聯函數

#define BAR(x) x+2 

,但後來我意識到,我需要一個內聯函數在它的位置,並結束了與下面的代碼

#define BAR(x) in_bar(x) 

inline double in_bar(double x) { 
    return x + 2; 
} 

void main() { 
    std::cout << BAR(2) << std::endl; 
} 

是它有效嗎?它似乎工作,但不會導致任何潛在的問題?

+2

爲什麼保持MACRO? – Jarod42

+0

@ Jarod42因爲否則我需要在多個地方編輯多個文件,並且它根本就不值得浪費時間... – Tim

+3

'內聯雙BAR(double d){return x + 2;}'? – Jarod42

回答

3

這是有效的,但沒有必要。請直接從main調用內聯函數。此外,main應該返回int

inline double in_bar(double x) { 
    return x + 2; 
} 

int main() { 
    std::cout << in_bar(2) << std::endl; 
} 
+0

答案是正確的,如果您只評論了爲什麼問題中的方法是有效的,我會很樂意接受您的答案。最後,我最終使用了內聯函數並根據您和註釋中的建議編輯了代碼。 – Tim

+0

@Tim的人已經建議這種方法是有效的,因爲沒有邏輯/語法錯誤並編譯成相同的彙編代碼。宏「BAR」是多餘的。 – Shreevardhan

+0

我知道它是多餘的,我的問題是,如果編譯器能正確處理所描述場景中的內聯函數(因爲宏和內聯函數要求編譯器執行相同的操作)。 – Tim

1

你原來的宏被打破,並使用功能將糾正。

E.g.如果有人寫了bar(1<<2)*4它會生成1 < < 2 + 2 * 4,這不是你所期望的。

如果您的某些代碼依賴於該不良行爲,結果將會有所不同(但在大多數情況下,函數變體會更好)。 正如其他人所建議的那樣 - 只要讓BAR成爲內聯函數,不需要任何宏。

BTW:適當的宏將

#define BAR(x) ((x)+2) 
+3

或者原始宏是正確的,並且使用函數會導致行爲發生不希望的變化... –

+0

對於那些依賴於破碎代碼的客戶端代碼 - 我在答案中補充說,效果是相同的,即客戶在更改後會變得破碎。但是沒有任何文檔描述宏的行爲,我說宏已經壞了。 –