1。宏定义的参数不能带类型
如#define TtoA(LPCSTR lpszA, LPTCSTR lpszT) wsprintfA(lpszA, "%ls", lpszT);
是不对的。
应该为#define TtoA(lpszA, lpszT) wsprintfA(lpszA, "%ls", lpszT);
2。宏定义里面不能带有条件指令
如#define...
#ifdef
#endif
3. 宏定义中的##和#
## 连接符号由两个井号组成,其功能是在带参数的宏定义中将两个子串(token连接起来,从而形成一个新的子串。但它不可以是第一个或者最后一个子串。
#符是把传递过来的参数当成字符串进行替代,简单说就是在对它所引用的宏变量通过替换后在其左右各加上一个双引号。
补:##符或#符只有在双引号之外时才起作用,因为如果在双引号之内的话,它本身就是字符串本身的一部分了。
假设程序中已经定义了这样一个带参数的宏:
#define PRINT( n ) printf( "token" #n " = %d", token##n )
同时又定义了二个整形变量:
int token9 = 9;
现在在主程序中以下面的方式调用这个宏:
PRINT( 9 );
那么在编译时,上面的这句话被扩展为:
printf( "token" "9" " = %d", token9 );
逗号前面的拼接成了一个字符串,也即
printf("token9=%d", token9);
token##n 中,9被原封不动的与token连接在了一起,成为了token9。而#n被”9”所替代。
结果打印出token9=9
补充:还是用例子好理解
假设调用PERROR("socket")。
(1)#define PERROR(a) printf(""a": %d", (int)GetLastError())
打印结果:socket: 10093
(2)#define PERROR(a) printf(""#a": %d", (int)GetLastError())
打印结果:"socket": 10093
(3)#define PERROR(a) printf("a: %d", (int)GetLastError())
打印结果:a: 10093
(4)#define PERROR(a) printf("#a: %d", (int)GetLastError())
打印结果:#a: 10093
(5)#define PERROR(a) printf(""##a": %d", (int)GetLastError())
编译错误
(6)#define PERROR(a) printf("##a: %d", 1##a)
假设调用PERROR("socket"),则编译错误,因为1##a展开后成了1"socket"。
假设调用PERROR("23"),也同样编译错误,因为1##a展开后成了1"23"。
假设调用PERROR(23),则正确,打印结果:##a: 123