C
语言的预处理器(preprocessor)是其编译过程中的特殊部分。它可以识别、分析并按照其描述进行处理。C语言的预处理器发生在编译之前,不属于编译的一部分。
C语言的预处理器比较常见的包括:#include,#define,宏(macro)和#error。
#include
#include可以说是c语言中最常见的预处理器,用来引用头文件。比如引用stdio.h:
#include <stdio.h>
#define
#define 的作用是将程序中的一些常量命名,如:
#define YES 1
#define PI 3.14
#define MYNAME "paul"
需要注意的是这些命名与变量赋值不同。变量赋值会在内存中划出一片区域用于存储该变量,#define属于预处理,发生在编译之前,编译器不会划出内存来存储#define的值。在编译前,编译器会找到程序中出现的#define对应的名称并将其替换为对应的值。
宏(macro)
宏是一种特殊的#define方式,它实现了类似于函数的功能。比如:
#define SQUARE(n) n*n
在程序中可以这样使用:
#include <stdio.h>
#define SQUARE(n) n*n
int main()
{
int x = 3;
int y = SQUARE(x);
printf("%d",y);
return 0;
}
运行结果是:9。
其他的一些宏:
比较大小
#define MAX(a,b) ( ((a) > (b)) ? (a) : (b) )
检查一个字符是否是小写
#define IS_LOWER_CASE(x) ( ((x) >= 'a') && ((x) <= 'z') )
以及多参数的宏(Variadic Macros)
#define debugPrintf(...) printf("DEBUG: " __VA_ARGS__);
使用该宏的时候,变量可以是一个,如
#define debugPrintf(...) printf("DEBUG: " __VA_ARGS__);
int main()
{
debugPrintf("Hello World!\n");
return 0;
}
也可以是多个
#define debugPrintf(...) printf("DEBUG: " __VA_ARGS__);
#define testprintf(...) printf("test: " __VA_ARGS__);
int main()
{
int x=12;
int y=13;
debugPrintf("x=%d, y=%d\n", x, y);
testprintf("hey hey");
return 0;
}
#error
#error将字符串直接输出到error stream:
#error "error message"