1. 字符串化操作符#
#include <stdlib.h>
#include <stdio.h>
#define warn_if(x)\
do{\
if(x)\
printf("warn "#x"\n");\
}while(0);
int main()
{
int eric = 3;
warn_if (eric == 3);
warn_if (eric == 2);
return 0;
}
2. 连接字符串
#define lian(x,y) x##y
int lian(xx,yy) = 1;
cout<<xxyy<<endl;
output 1
用法1
#define DESC_LEN 5
struct ModuleDesc
{
ModuleNo no;
char desc[DESC_LEN+1];
};
#define MODSTRING(mod) {mod,##mod}
struct ModuleDesc desc[]=
{
MODSTRING(PR000),
MODSTRING(SY000)
};
用法2
当为空时消除前面的逗号
例如
#define myprint(str,...) fprintf(stderr,str,__VA_ARGS__)
如果一下调用时
myprint("eric"); 编译会失败.
这时定义宏如下
#define myprint(str,...) fprintf(stderr.str,##__VA_ARGS__)可以解决此问题
同理,可变参有名称时定义如下:
#deifine myprint(str, args...) fprintf(stderr,str,##args)
3. 字符化操作符
#define ToChar(x) #@x
在g++中不能编译通过,应该是不支持。