标记与预处理标记
标记(token)是C程序编译步骤7、步骤8中最小的词汇元素,标记包括以下5个类别:
- 关键词(keyword)
- 标识符(identifier)
- 常量(constant)
- 字符串字面量(string-literal)
- 标点符号(punctuator)
预处理标记(preprocessing-token)是C程序编译步骤3至步骤6中最小的词汇元素,预处理标记包括以下7个类别:
- 头文件名(header-name)
- 标识符(identifier)
- 预处理数(pp-number)
- 字符常量(character-constant)
- 字符串字面量(string-literal)
- 标点符号(punctuator)
- 不属于上述预处理标记类别的非空格字符(non-white-space character)
在编译步骤4会使用一种附加类别-位置标识(placemarkers),但该位置标识不会在源文件中出现。如果'或者"字符匹配预处理标记的最后一个类别,其行为是未定义的。
预处理标记可以使用空格进行分隔;空格由注释或者空格字符(空格字符包括空格符、水平制表符、换行符、垂直制表符、换页符。)组成,或者同时由两者组成。以下两个预处理指令都是合法的。
#define LENGTH/*长度*/10 #define WIDTH 5 /*宽度*/
将输入流解析成预处理标记时,预处理标记应为构成预处理标记的最长字符序列,例如:
A+++++B
将解释为A ++ ++ + B,而不是A ++ + ++ B;尽管前者是无效的C程序代码,而后者是有效的C程序代码。
上述规则有个例外:头文件名预处理标记仅在#include预处理指令内和#pragma指令实现定义的位置识别。这种情况下,如果字符序列可以解析为头文件名,也可以解析为字符串字面量,将作为头文件名处理。