宏注意事项

#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

你可能感兴趣的:(宏注意事项)