宏注意事项

#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)
时间: 2024-08-07 12:30:42

宏注意事项的相关文章

C语言预处理命令详解

一  前言 预处理(或称预编译)是指在进行编译的第一遍扫描(词法扫描和语法分析)之前所作的工作.预处理指令指示在程序正式编译前就由编译器进行的操作,可放在程序中任何位置. 预处理是C语言的一个重要功能,它由预处理程序负责完成.当对一个源文件进行编译时,系统将自动引用预处理程序对源程序中的预处理部分作处理,处理完毕自动进入对源程序的编译. C语言提供多种预处理功能,主要处理#开始的预编译指令,如宏定义(#define).文件包含(#include).条件编译(#ifdef)等.合理使用预处理功能编

C语言预处理器命令详解【转】

本文转载自:http://www.cnblogs.com/clover-toeic/p/3851102.html 一  前言 预处理(或称预编译)是指在进行编译的第一遍扫描(词法扫描和语法分析)之前所作的工作.预处理指令指示在程序正式编译前就由编译器进行的操作,可放在程序中任何位置. 预处理是C语言的一个重要功能,它由预处理程序负责完成.当对一个源文件进行编译时,系统将自动引用预处理程序对源程序中的预处理部分作处理,处理完毕自动进入对源程序的编译. C语言提供多种预处理功能,主要处理#开始的预编

Ruby操作VBA的注意事项和技巧:乱码、获取VBA活动和非活动窗口的名称与路径、文件路径的智能拼接与截取(写入日期)、宏里调用和控制窗体以及窗体上的控件、不同workbook之间的宏互相调用、

1.VBA编辑器复制粘贴出来的代码乱码     解决方法:切换到中文输入模式再复制出来就行了 2.获取VBA活动和非活动窗口的名称与路径 1 1 Dim wbpath, filename As String 2 2 wbpath = ThisWorkbook.Path ’这个获取的是宏所在的workbook的路径 3 3 'filename = ThisWorkbook.Name '这个是宏所在的workbook的名字,不带路径 4 4 filename = ActiveWindow.Capti

App Today Extension开发注意事项

从iOS 8起,就有了App Extension.Extension的种类至今也扩充到了19种,应用也很广泛,值得重点关注起来. Extension几乎可以看做一个内嵌的独立App,拥有独立的BundleID.证书.概要配置文件.进程空间.沙盒等等.只是需要打包在App内,类似于寄生在宿主App内,捆绑安装.不过一旦安装应用后,扩展可以由系统独立调用,执行扩展内的代码逻辑. 这篇只记录之前开发Today Extension的过程中,值得注意的事项.其实大多都是通用的. 1.创建Extension

GPGPU OpenCL/CUDA 高性能编程的10大注意事项

转载自:http://hc.csdn.net/contents/content_details?type=1&id=341 1.展开循环 如果提前知道了循环的次数,可以进行循环展开,这样省去了循环条件的比较次数.但是同时也不能使得kernel代码太大. 1 #include 2 using namespace std; 3 4 int main(){ 5 int sum=0; 6 for(int i=1;i<=100;i++){ 7 sum+=i; 8 } 9 10 sum=0; 11 fo

Swift和Objective-C混编注意事项

前言 Swift已推出数年,与Objective-C相比Swift的语言机制及使用简易程度上更接地气,大大降低了iOS入门门槛.当然这对新入行的童鞋没来讲,的确算是福音,但对于整个iOS编程从业者来讲,真真是,曾几何时"高大上",转瞬之间"矮矬穷".再加上培训班横行,批量批发之下,iOS再也看不到当年的辉煌.iOS10推出后,紧跟着Xcode8也推送了更新,细心者会发现,Xcode8下iOS版本最低适配已变为iOS8.0,加上Swift版本趋于稳定,从某种意义上讲,

Qt3升至Qt4需要注意的几件事项浅谈

公司以前的项目是用Qt3写的,随着时间的推移慢慢显示出Qt3有多方面的限制,因此先公司决定用Qt4来改写这个项目,并为软件添加新功能,在此背景先编写此文章. 先扯一下没用的:gotfocus是获得焦点时触发,Lostfocus是失去焦点的时候触发.比如:新建两个文本框,当点击第一个文本框的时候,则触发第一个文本框的getfocus事件,表示第一个文本框获得了焦点,可以进行操作了.然后鼠标点击第二个文本框的时候,第一个文本框首先触发lostfocus事件,标明它已经失去焦点,无法进行操作.同时第二

勒索病毒紧急防范步骤和注意事项

勒索病毒紧急防范步骤和注意事项 为防止我们的电脑感染勒索病毒,造成不可预估的损失,请在开机之后进行如下操作,操作过程中,不要运行任何来历不明的程序.脚本,不要点击任何来历不明的链接,直到完成下面所有操作内容. 1.拔网线断网(台式机最好开机前拔掉网线) 2.备份重要数据到移动硬盘或U盘 3.将以下内容保存为bat文件双击运行按提示操作 %1 mshta vbscript:CreateObject("Shell.Application").ShellExecute("cmd.e

宏定义中##和#的作用

解释1 : 定义中##和#的作用内核中有很多的宏定义,在宏定义define中经常看到两个字符串##和#,这里把它的用法做一下说明:1. ####是一个连接符号,用于把参数连在一起例如:> #define FOO(arg) my##arg则> FOO(abc)相当于 myabc2.#:是"字符串化"的意思.出现在宏定义中的#是把跟在后面的参数转换成一个字符串例如:> #define STRCPY(dst, src) strcpy(dst, #src)则> STRC