宏注意事项

#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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值