0

失败的宏

宏(计算机科学)

在我阅读了上面的文章之后,我仍然不太确定宏只是一个函数还是其他任何东西。宏等于功能吗?

例子:

    //  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;
4

1 回答 1

6

在 C 和 C++ 中,宏是一种“用那个替换这个”类型机制,在很多意义上与函数完全不同。它有时可以用来替换函数,但你应该非常小心。用作函数的宏中一些著名的“失败”如下:

#define SQR(x) x * x

.... 

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

这不会给出 36,而是 (x + 1 * x + 1),在我的脑海中会产生 12 - 这不是你想要的。可以通过使用函数或xSQR宏中添加额外的括号来修复。

宏的另一个“聪明”用法:

#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++;

现在,这将出错(在这种特殊情况下,如果我们避免由于“丢失”结束标记而导致崩溃并继续......),因为:

IS_UPPER(*str++)

翻译为:

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

其中,如果str在字符串“Some ...”的开头,则第一步为真,但第二步不为真,因为我们现在指向不小于或等于'的'o' Z'。使用函数将在这里“按预期”工作。

于 2013-06-30T09:29:49.920 回答