【发布时间】:2021-05-17 00:04:31
【问题描述】:
N2479 C17..C2x 工作草案 — 2020 年 2 月 5 日 ISO/IEC 9899:202x (E):
6.10.2 源文件包含
实现应为由一个或多个非数字或数字 (6.4.2.1) 后跟句点 (.) 和单个非数字组成的序列提供唯一映射。第一个字符不能是数字。
问题:不允许 #include 指令的参数 (char-sequence) 以数字开头的原因是什么?
额外的问题:编译器似乎不会在违反上述应要求时生成任何诊断消息(例如使用#include "1.h")。为什么?
UPD。后来我的同事回答:The first character shall not be a digit 只与unique mappings 相关。所以,标准被误解了。
【问题讨论】:
-
@EricPostpischil -- “第一个字符不能是数字”怎么样?
-
@adabsurdum:糟糕,错过了。
-
@pmor -- 只有违反语法规则和约束时才需要诊断;这两者都不是,因此不需要诊断。但是,由于违反了约束之外的“应”,它仍然是未定义的行为。
-
@adabsurdum:这里没有违反规则。该段没有说程序不能使用这样的序列。该段落只允许实现不唯一地映射它; “1.h”可以映射到与“foo.h”相同的标题。
-
@EricPostpischil -- 6.10.2 5 表示 h-char-sequence 或 q-char-sequence 的第一个字符“应不是数字。”使用 q-char-sequence "1.h" 违反了应该,因此它是 4 2 的未定义行为:"如果出现在外部的“应该”或“不应”要求的约束...." 也许实现没有为序列提供唯一的映射;也许它根本不提供。还是我误读了什么可怕的东西?
标签: c include language-lawyer c-preprocessor diagnostics