一、#的用法
#用于编译器编译过程进行预处理。
1、宏定义
#define ON 1
#ifndef _PARA_
#define _PARA_
#enddef
#ifdef _PARB_
#define DEFAULT_SIZE 1024
#enddef
2、宏开关
#if VAR
...
#elif
...
#end
3、显示设定错误
#error ERROR: Not Define
4、设置字节对齐
#pragma pack(1)
#还可以用于宏定义时转变参数为字符串,需要注意#无法再次展开,宏定义替换的时候遇到#就停止向下进一步展开,但是可以通过中间再写一个转换宏,进行替换。
e.g.1:
#define STR(str) #str
char *mystr = STR(test);
printf("%s",mystr);
result: "test"
e.g.2:
#define STR(str) #str
char *myits =STR(1024);
printf("%s",myits);
result: "1024"
e.g.3:
#define STR(str) #str
#define SIZE 1024
char *myint =STR(SIZE);
printf("%s",myint);
result: "SIZE" //此处输出式SIZE 因为SIZE是一个宏,不会再展开
e.g.4:
#define _STR(str) #str
#define STR(str) _STR(str)
#define SIZE 1024
char *myint =STR(SIZE);
printf("%s",myint);
result: "1024" //增加了中间层,可以正确转换
二、##的用法
##用于宏定义时将两个内容进行拼接。
e.g.1:
#define LINK2(a,b) a##b
char *mystr = LINK2(o,k);
printf("%s",mystr);
result: "ok"
e.g.2:
#define LINK3(a,b,c) a##b##c
char *mystr = LINK3(c,+,+);
printf("%s",mystr);
result: "c++"