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)
在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 - 不是你想要的.可以使用函数修复,也可以x在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++;
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".使用函数将在此处"按预期"工作.