双引号 (") 是预处理标记还是未终止的字符串文字?
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
该段正在讨论的类型的指令。)
双引号 ("
) 是预处理标记还是未终止的字符串文字?
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
该段正在讨论的类型的指令。)