宏注意事项
#define A B C 如果使用A将会替换成B C,使用A B会得到B C B
#define A (B C)如果使用A将会替换成(B C)
注意上面加括号与不加是完全不同的,特别是在定义函数和函数指针的时候。下面例子:
- #define BASSDEF (f) (WINAPI *f ) // define the functions as pointers
- DWORD BASSDEF (BASS_GetDevice)();
上面这行代码展开应该是这样的:
- DWORD (WINAPI * BASS_GetDevice)();
这是在定义函数指针!而不是在定义函数!
但是如果把括号去掉变成:
- #define BASSDEF ( f) WINAPI *f // define the functions as pointers
展开宏就变成了:
- DWORD WINAPI * BASS_GetDevice();
这只是在定义函数而已。
使用第二种情况将不可能通过编译(会导致链接错误)。
比如这个例子:
这是可以通过编译的;
- #define LOADBASSFUNCTION (f) *((void **)&f)=( void*)GetProcAddress (hBass,# f)