为什么预处理器会区分数字和字符标记?

fre*_*low 9 c c++ compilation token c-preprocessor

根据语言规范,词法元素定义如下:

token:
    keyword
    identifier

    constant

    string-literal
    operator
    punctuator

preprocessing-token:
    header-name
    identifier

    pp-number
    character-constant

    string-literal
    operator
    punctuator

    each non-white-space character that cannot be one of the above
Run Code Online (Sandbox Code Playgroud)

为什么预处理令牌级别上的数字和字符之间存在区别,而在令牌级别上,只有常量?我没有看到这种区别的好处.

ric*_*ici 5

C语法中非终端的名称不是规范性的; 它们只是为了描述而存在.只有正确描述行为才是重要的.语法本身不足以描述语言; 它需要与文本一起阅读,这对良构的程序施加了进一步的限制.

预处理程序令牌与程序令牌之间没有一对一的关系.存在重叠:预处理器identifier可能是关键字,也可能是各种可定义的符号类型之一(包括一些常量和typedef-names).A pp-number可能是整数或浮点常量,但也可能无效.词汇产品并非全部相互排斥,词汇类别实际应用于程序的子串需要标准文本中描述的过程,而不是正式语法.

字符常量直接从预处理器传递到程序语法而不进行修改(尽管它们被包含在constant类别中).如果有关于预处理程序编号的单个注释(例如,如果它们在预处理程序中存活,它们必须可转换为实数数字常量文字)是获得该类别的充分理由.

另外,它会添加什么包括character-constantpp-number?的定义中?您仍然需要两种产品来描述语言.

  • @mafso:这是一个约束违规(6.4/2"转换为令牌的每个预处理令牌都应具有关键字,标识符,常量,字符串文字或标点符号的词法形式."所以诊断是要求(5.1.1.3).但是,pp令牌可能永远不会转换为令牌.它可能被字符串化或忽略(`#define IGNORE(x)`/`IGNORE($ =>)`) (2认同)