宏等于功能?

zzz*_*zzz 0 c++ winapi direct3d direct3d9 directx-9

失败的宏

宏(计算机科学)

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

例:

    //  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;
Run Code Online (Sandbox Code Playgroud)

Mat*_*son 6

在C和C++中,一个宏是"用那个替换它"的类型机制,并且在许多意义上都不是一个函数.它有时候可以用来替换一个函数,但是你应该非常小心.用作函数的宏中一些着名的"失败"如下:

#define SQR(x) x * x

.... 

int x = 5;
int s = SQR(x+1);
Run Code Online (Sandbox Code Playgroud)

这不会给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++;
Run Code Online (Sandbox Code Playgroud)

现在,这将出错(在这种特殊情况下,鞋面保证为零,如果我们避免因"缺少"结束标记而继续崩溃并继续......),因为:

IS_UPPER(*str++)
Run Code Online (Sandbox Code Playgroud)

翻译为:

(*str++) >= 'A' && (*str++) <= 'Z'
Run Code Online (Sandbox Code Playgroud)

其中,如果str在字符串"Some ..."的开头,则第一步为真,但第二步不成立,因为我们现在指的是'o',它不小于或等于' Z".使用函数将在此处"按预期"工作.