2013-06-30 49 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