2

如果违反了“应该/不应”的要求,那么这种要求位于哪个部分(例如语义、约束)是否重要?

问题的原因:这个意见:

这是标准的语义部分,而不是约束,因此不需要诊断。

是否违反语义部分中的“应/不应”要求不需要诊断?

4

2 回答 2

5

语义违规不需要诊断消息,而约束违规则需要。

C11 标准中关于诊断的第 5.1.1.3p1 节规定如下:

如果预处理翻译单元或翻译单元包含违反任何语法规则或约束的行为,则符合的实现应产生至少一个诊断消息(以实现定义的方式标识),即使该行为也明确指定为未定义或实现-定义。在其他情况下不需要生成诊断消息。

于 2021-10-18T22:40:59.140 回答
1

该标准只是非常松散地定义了“语义”的实际含义。最重要的是,第 3 节标准的术语、定义和符号中没有该术语的定义。

该标准在该部分定义的是“约束”的含义:

3.8

1 个约束

句法或语义上的限制,通过它来解释语言元素的说明

增加了对“……或语义”的强调。

然后标准继续:

4. 一致性

1 在本文件中,“应”被解释为对实现或程序的要求;相反,"不得"应解释为禁止。

2 如果违反了出现在约束或运行时约束之外的“应”或“不应”要求,则行为未定义。

然后我们来:

5.1.1.3 诊断

1 如果预处理翻译单元或翻译单元包含违反任何语法规则或约束的行为,则一致的实现应产生至少一个诊断消息(以实现定义的方式标识),即使该行为也明确指定为未定义或实现-定义。

增加了对“……或约束”的强调。

根据 3.8,“仅”是一个语义限制并不排除某些东西是一个约束

根据 4. 1),“应”是要求,“不应”是禁止。

我将两者都解释为表示约束。

根据 5.1.1.3,不仅违反语法规则,而且违反约束都需要诊断,即使(根据 4. 2))“[...] 行为也明确指定为未定义或实现定义。”


但是,为了避免误解,请注意:

我在这里指的是标准中用“shall”/“shall not”指定的语义,而不是任何程序的任何语义。

于 2021-10-21T17:50:39.400 回答