宏注意事项

#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();
这只是在定义函数而已。
使用第二种情况将不可能通过编译(会导致链接错误)。
比如这个例子:
  • bool (*BASS_Free)();//定义指针
  • //...
  • HINSTANCE hBass;
  • hBass = LoadLibrary("bass.dll");
  • *((void**)&BASS_Free) = (bool(*)(void))GetProcAddress(hBass, "BASS_Free");
  • //...
这是可以通过编译的;
  • bool BASS_Free();//定义指针
  • //...
  • HINSTANCE hBass;
  • hBass = LoadLibrary("bass.dll");
  • *((void**)&BASS_Free) = (bool(*)(void))GetProcAddress(hBass, "BASS_Free");
  • //...

  • #define LOADBASSFUNCTION (f) *((void **)&f)=( void*)GetProcAddress (hBass,# f)
原文地址:https://www.cnblogs.com/wubugui/p/4247734.html