宏定义
在预处理之前,c预处理器会对代码进行翻译,譬如用blank替换注释,去掉多余的空格,删除末尾的\来拼接行等。
例如:
int /*注释*/ x;
会被翻译成
int x;
printf("this is a s\
entence.");
会被翻译成
printf("this is a sentence.");
这之后,将会处理预处理指令
每个#define由3部分组成:指令#define本身、缩略语(宏)、替换列表(主体)。
#define FOUR 2*2
#define FOUR 2 * 2
#define FOUR 2 * 2
上面后2个是相同的,替换列表有3个语言符号,因为用空格分割开了,而第一个是一个语言符号2*2
在#define可以使用参数
例如:
#define SQUARE(X) X*X
表示求面积
int area = SQUARE(3);
area = 9
但是 int area2 = SQUARE(3+1);
area2 = 7
因为area2 = 3+1*3+1
宏定义我简单理解是先被解释成一段新的简单的字符串代码,再去编译这段代码,调用宏就是调用这段代码。作为java程序员我理解就是bsh干的事。
利用宏参数创建字符串
使用#,例如:
#define SQUARE(x) printf("the square of " #x " is %d.\n",((x)*(x)))
int a = 10;
SQUARE(a);
输出:the square of a is 100.
使用##,例如:
#define XN(n) x ## n
int XN(2) = 10;
printf("the value is %d.\n",x2);
输出:the value is 10.
宏还是函数?
有的编译器宏只能定义成1行
宏产生内联代码,增加了编译后的代码量
宏不检查类型
其它宏
#ifdef
#ifndef
#if
#else
#elif
#endif
上面的意思很明显,不过在使用的过程中要注意缩进
#if A == 1
#define B 1
#elif A == 2
#define B 2
#else
#define B 12
#endif
#line 用于重置行和文件信息
#line 1000 //当前行号重置为1000
#line 10 "test.c" //把行号重置为10,文件名重置为test.c
#error 用于给出错误信息
#if 条件
#error 错误信息
#endif
#pragma 想编译器发出指令
#pragma 命令