2013-06-30 47 views
0

FAILED macro宏等於函數?

Macro (computer science)

後,我看了上面的文章中,我仍然不是很確定是否宏觀僅僅是一個函數或其他任何東西。宏是否等於函數?

實施例:

// Create a Direct3D 9 device. 
    hr = direct3D9->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, g_hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dPP, &d3dDevice); 

    // Cout out the message to indicate the failure. 
    if(FAILED(hr)) 
     return 0; 
+0

我想如果我沒有記錯的話,宏可能有也可能沒有參數,但是所有函數都有。宏不返回任何東西返回給調用者,而功能必須選擇或不。 – ha9u63ar

+1

我使用cout << FAILED(hr)<< endl;並檢查它在控制檯窗口上顯示零值。 – zzz

+0

是的,我的意思是,你也可以有'std :: cout << __ DO_SOMETHING__ << std :: endl;'。 – ha9u63ar

回答

6

在C和C++的宏是一種類型的機構在所有相同於很多感官的功能「與替換這個」,而不是。它可以用來代替一個功能,但你應該非常小心。作爲函數宏一些著名的「失敗」如下:

#define SQR(x) x * x 

.... 

int x = 5; 
int s = SQR(x+1); 

這不會給36,但(X + 1 * X + 1),這在我的頭上,使12 - 你想不是。可以使用函數固定,或者在宏的SQR宏中添加額外的括號。

另一種「聰明」使用宏:

#define IS_UPPER(c) ((c) >= 'A' && (c) <= 'Z') 

char *str = "Some String With a few Upper Case letters"; 
int uppers = 0; 
while(*str) if (IS_UPPER(*str++)) uppers++; 

現在,這會出問題(鞋面是保證零在這種特殊情況下,如果我們避免崩潰,因爲「失蹤」的結束標誌和繼續進行下去......),becasue:

IS_UPPER(*str++) 

翻譯爲:

(*str++) >= 'A' && (*str++) <= 'Z' 

,如果str在字符串「Some ...」的開頭,對於第一步將是真實的,但對於第二步不是真實的,因爲我們現在指向不小於或等於'Z'的'o' 。使用函數在這裏「按預期」工作。

+0

很好的答案。使用宏不能強調要非常小心! – Manuzor