我们可以通过#ifdef和#ifndef来检查是否定义了预处理器标识,也可以通过#if 和#elif来检查常量表达式的值。在#if 和#elif表达式中,常常是用defined运算符来检查是否定义了预处理器标识符。
还有用来包含文件的#include和用来撤销预处理器标识符的#undef在c语言中是常见的预处理器。
首先研究一下
1.字符串的内部连接
预处理可以将相邻的字符串常量连接起来,这种方便的处理机制是的我们容易将一长字符串分成若干段来输入。这同样适合用于符号表示的字符串化,下面举个例子给大家:
#include <stdio.h>
void main(viod)
{
printf("hello\n""smallbox\n""!\n");
}
2.符号表示的字符串化------#预处理器运算符
#预处理运算符可以把一个#define 参数转化为一个内部字符串,这个字符串包含了替换的内容。由于参数被转化了一个字符串,因此有时又把这叫做“字符串化”(stringizing)。下面是一个例子:
#include <stdio.h>
#define print(a) printf(#a ":%d\n",(a));
void main(void)
{
int smallbox = 100;
print(smallbox);
}
在print宏定义中,表达式#a被一个包含初始参数的字符串所替代,在这个例子中是"smallbox"。在符号表示被字符转化以后结果就是被输出正这样:
smallbox:100
3.符号表示的连接------##预处理器操作符
##预处理器操作符被用来将两个符号表示连接起来,从而形成一个新的符号表示。对于需要用相同的名字来建立一系列标识符的情况,这就显得非常的有用了,下面给出一个例子:
#include "stdlib.h"
#include "stdio.h"
#define ErrMsg(n,txt) char Err##n[] = "Error" #n ":" txt "\n";
ErrMsg(0,"Too many chips")
ErrMsg(1,"Too much soda")
ErrMsg(2,"Too little sunlight")
void main(void)
{
printf("hello\n""world\n");
printf("%s",Err0);
printf("%s",Err1);
printf("%s",Err2);
}
下面是输出结果:
Error0:Too many chips
Error1:Too much soda
Error2:Too little sunlight