- # include 包含一个源代码文件
- # define 宏定义
- # undefine 取消已定义的宏定义
- #if 如果条件为真,则编译下面的代码
- #ifdef 如果宏定义存在,则编译下面代码
- #ifndef 若未定义宏定义,则编译下面代码
- #elif 前面#if条件不为真,此条件为真则编译下面代码
- #endif结束一个#if...#else条件编译块
- #error停止编译并显示错误信息
什么是预编译指令
预处理指令是以#号开头的代码行。#号必须是该行除了任何空白字符外的第一个字符。#后是指令关键字,在关键字和#号之间允许存在任意个数的空白字符。整行语句构成了一条预处理指令,该指令将在编译器进行编译之前对源代码做某些转换。
1 #define
1.1 错误使用
#include <stdio.h>
#define SQR(x) (x*x)
int main(void)
{
int b=3;
#ifdef SQR//只需要宏名就可以了,不需要参数,有参数的话会警告
printf("a = %d\n",SQR(b+2));
#endif
return 0;
}
/*
*首先说明,这个宏的定义是错误的。并没有实现程序中的B+2的平方
* 预处理的时候,替换成如下的结果:b+2*b+2
* 正确的宏定义应该是:#define SQR(x) ((x)*(x))
* 所以,尽量使用小括号,将参数括起来。
*/
1.2 用宏得到一个字的高位或地位字节
#include <stdio.h>
#define WORD_LO(xxx) ((byte)((word)(xxx) & 255))
#define WORD_HI(xxx) ((byte)((word)(xxx) >> 8))
int main(void)
{
return 0;
}
/*
* 一个字2个字节,获得低字节(低8位),与255(0000,0000,1111,1111)按位相与
* 获得高字节(高8位),右移8位即可。
*/
1.3 用宏得到一个数组的长度
#include<stdio.h>
#define ARR_SIZE(x) (sizeof((a)) / sizeof((a[0])))
int main() {
int array[100];
#ifdef ARR_SIZE
printf("Array has %d items.\n", ARR_SIZE(array));
#endif
return 0;
}