2013-12-07 30 views
0

常見問題中有一個示例解釋內聯和#define之間的區別。該代碼是在這裏 和鏈接是:http://www.parashift.com/c++-faq/inline-vs-macros.html內嵌與C++ FAQ示例對比#define

用Visual C++試過了,都unsafe()unsafe(f())沒有增加i兩次。這個例子有錯誤嗎?

+1

郵編,不鏈接代碼。 – nhgrif

+2

該示例沒有任何輸出 - 您需要顯示您所做的顯示值。乍一看,這個例子似乎沒有任何問題。 –

+0

宏中有一個比較。該比較調用一個函數。所以它被評估兩次。順便說一下,該網站是衆所周知的非常好,所以你可以信任它。並用調試器檢查你所有的疑惑 – Tebe

回答

5

的#define的主要思想是,它僅僅是一個預處理指令,意思是這樣的:

#define unsafe(i) ((i) >= 0 ? (i) : -(i)) 

將預處理之前,你的代碼被編譯,並且將取代聲明

unsafe(x++); 

以下內容

((x++) >= 0 ? (x++) : -(x++)); 

每次評估x ++,x都會遞增。

一個可能的原因是爲什麼您在獲取此示例代碼時遇到問題可能是您通過優化來優化所有未使用/不必要的代碼來編譯代碼。

如果你不在任何地方使用你的x,那麼它被認爲是未使用的,因此不會被包含到編譯代碼中。

+0

VC++中的哪個編譯器選項會優化代碼? – user3078106

+0

我相信它的-O或-O2。但是,如果你只是在學習,那麼我建議不要打擾那些旗幟。相反,請注意,VC++解決方案(項目)有兩種默認配置,即Debug和Release。前者不使用優化,因此我建議在Debug中運行示例代碼,後者使用一些默認優化技術進行優化,包括上面描述的優化技術。 –

0

剛剛測試過的例子,檢查Eric Gopak's answer的解釋:

// A macro that returns the absolute value of i 
#define unsafe(i) \ 
    ((i) >= 0 ? (i) : -(i)) 

// An inline function that returns the absolute value of i 
inline 
int safe(int i) 
{ 
    return i >= 0 ? i : -i; 
} 

int countCalls = 0; 

int f() 
{ 
    return countCalls++; 
}; 

int main() 
{ 
    int x = 0; 
    int ans = 0; 

    ans = unsafe(x++); // Error! x is incremented twice 
    ans = unsafe(f()); // Danger! f() is called twice 

    // x = 2 
    // countCalls = 2 

    ans = safe(x++);  // Correct! x is incremented once 
    ans = safe(f());  // Correct! f() is called once 

    // x = 3 
    // countCalls = 3 

    return 0; 
} 
+0

奇怪的是,我用你的代碼(實際上我的是相同的),但是從不安全()調用得到x = 1。你在用什麼編譯器?我使用visual C++ express 2010.你還使用了哪些編譯器選項?我所用的都是默認設置。 – user3078106

+0

@ user3078106你應該得到ans = 0,因爲它是後增量,但ans = 1。 – uk4321

+0

@ user3078106我使用Visual Studio 2013,現在我也在2010年測試了它,它提供了相同的結果(如我所料)。是否有可能在發佈模式下運行程序?在發佈模式中提供的值不總是可信的。看到[這個答案](http://stackoverflow.com/a/9224051/531122) –