双引号 (") 是预处理标记还是未终止的字符串文字?

Is double quote (") a preprocessing-token or an unterminated string literal?

双引号 (") 是预处理标记还是未终止的字符串文字?

C11, 6.4 词汇元素,语法,1:

preprocessing-token:
    header-name
    identifier
    pp-number
    character-constant
    string-literal
    punctuator
    each non-white-space character that cannot be one of the above

C11,6.4.5 字符串文字,语法,1:

string-literal:
    encoding-prefix(opt) " s-char-sequence(opt) "

注意:GCC 认为它是一个未终止的字符串文字:

#if 0
"
#endif

产生:

warning: missing terminating " character

C 2018 6.4.1 3 说一类预处理标记是“单个 non-white-space 字符,它们在词法上与其他预处理标记类别不匹配”,下一句说“如果一个 " 字符匹配最后一个类别,行为未定义。”因此,如果出现孤立的 "(未与另一个 " 配对且它们之间有 s-char-sequence),则无法匹配字符串文字的词法形式,并被解析为与其他类别不匹配的单个 non-white-space 字符,并且该行为未由标准定义。这解释了 GCC 消息。

(我注意到 6.10.2 3 用“" q-char-sequence [=11]描述了 # include 指令=] new-line”。但是,6.10 1 中较早的语法将指令描述为“# include pp-tokens new-line”。我对此的解释是指令被解析为具有预处理器标记,特别是字符串文字,和 6.10。 2 3 表示如果该字符串文字的形式显示为“" q-char-sequence "”,则它是一个 # include 该段正在讨论的类型的指令。)