C Primer Plus - c预处理器

目录:
翻译程序的第一步
明示常量: #define

本章介绍以下内容
预处理指令 #define #include #ifdef #ifndef #else #endif #if #elif #line #error #pragma
共有 11个以#号开头的预处理指令。

c预处理器在程序执行之前查看程序(故称之为预处理器)。根据程序中的预处理指令,预处理器把符号缩写替换成其表示的内容。预处理器可以包含程序所需的其他文件,可以选择让编译器查看哪些代码。预处理器并不知道c。基本上它的工作是把一些文本转换为另一些文本。

翻译程序的第一步
在预处理之前,编译器必须对该程序进行一些翻译处理。
首先,编译器把源代码中出现的字符映射到源字符集。该过程处理多字节字符和三字符序列。

第二,编译器定位每个反斜杠后面跟着换行符实例,并删除他们。也就是说,把下面两个物理行(physical line) :
printf(“That’s wond
erful!\n”);
转换成一个逻辑行(logical line):
printf(“That’s wonderful!\n”);

注意,这种场合中,“换行符”的意思是通过按下Enter键在源代码文件中换行所生成的字符,而不是指符号表征\n。

由于预处理表达式的长度必须是一个逻辑行,所以这一步为预处理器做好了准备工作。一个逻辑行可以是多个物理行。

第三,编译器把文本划分成预处理记号序列、空白序列和注释序列(记号是由空格、制表符或换行符分隔的项)。这里要注意的是,编译器将用一个空格字符替换每一个注释。因此,下面的代码:

int/这里看起来并不像一个空格/fox;
将变成:
int fox;
而且,实现可以用一个空格替换所有的空白字符序列(不包括换行符)。最后程序已经准备好进入预处理阶段,预处理器查找一行中以#号开始的预处理指令。

明示常量: #define

#define预处理指令和其他预处理指令一样,以#号作为一行的开始。ANSI和后来的标准都允许#号前面有空格或制表符,而且还允许在#和指令的其余部分之间有空格。但是旧版本的c要求指令从一行的最左边开始,而且#和指令其余部分之间不能有空格。指令可以出现在源文件的任何地方,其定义从指令出现的地方到该文件末尾有效。我们大量使用#define指令来定义明示常量(manifest constant)(也叫符号常量),但是该指令还有许多其他用途。程序清单,演示了#define指令的一些用法和属性。

/*简单的预处理示例*/
#include <stdio.h>
#define TWO 2
#define OW "Consisteny is the last refuge of the unimagina\
tive.- Oscar Wilde" /*反斜杠把该定义延续到下一行*/
#define FOUR TWO*TWO
#define PX printf("X is %d.\n", x)
#define FMT "X is %d.\n"
int main(void)
{
int x = TWO;
PX;
x = FOUR;
printf(FMT,x);
printf("%s\n", OW);
printf("TWO:OW\n");
return 0;
}

每行#define (逻辑行) 都由3部分组成。第一部分就是#define指令本身。第2部分是选定的缩写,也称为宏。有些宏代表值(如本例),这些宏被称为类对象宏(object-like macro)。c语言还有类函数宏(function-like macro)。宏的名称中不允许有空格,而且必须遵循C变量的命名规则:只允许使用字符、数字、下划线(_)字符,而且首字符不能是数字。第3部分(指令行的其余部分)称为替换列表或替换体(见图1.1)。
一旦预处理器在程序中找到宏的示实例后,就会用替换体替换该宏(也有例外)。从宏变成最终替换文本的过程称为宏展开(macro expansion)。注意,可以在#define行使用标准C注释。如前所述,每条注释都会被一个空格替换。
在这里插入图片描述
运行该程序后,输出如下:
在这里插入图片描述
下面分析具体的过程。下面的语句:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值