标准C有哪些约束?

阿玛利

C标准谈论约束,例如ISO / IEC 9899:201x定义了术语


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

并在符合性一章中说

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

在“环境”中的“诊断”小节中说

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

因此,重要的是要知道C中的约束是什么,例如对于编译器编写者判断何时需要诊断,或者对于C程序员而言,何时可以期望诊断而不只是不确定的行为,这一点很重要。
现在,整个标准文档中都有标题为Constraints的部分,但是我无法找到有关术语约束在标准中确切涵盖的确切措辞

  • 约束是否显示在标题为约束的部分中
  • 在这些部分之外陈述的每个要求不是约束吗?
  • 我错过的标准中是否有关于约束的全面描述
彼得-恢复莫妮卡

约束是否显示在标题为约束的部分中?

从n1570 3.8的意义上讲(对程序施加了限制,要求有一个合格的实现才能在违反该规范时发出编译时诊断消息),我认为是。

在这些部分之外陈述的每个要求不是约束吗?

从3.8的意义上讲,我认为是的,但是出于更加循环的原因:该标准的结构相当正式。只要适用,似乎就会有一个明确的“约束”部分。因此,我理解从定义上讲,任何不在约束部分的东西都不是3.8的约束。
在“约束”部分之外有一些“应”子句,它们看起来完全是可在编译时执行的,请参见。下面举几个例子。它们通常在相邻的语义中部分。在一般情况下,我可能会遗漏一些微妙的细节,以至于无法进行编译时检测(以至于无法强制执行诊断),或者标准不完全一致。但是我认为编译器可以简单地翻译违规程序,正是因为要求不在“约束”部分中。

我错过的标准中是否有关于约束的全面描述

我认为3.8就足够了。我尝试探索以下术语,并同意该定义不令人满意。


我对标准进行了更深入的研究以发现这一点。这是我的研究。

术语约束

让我们从基础开始。令人惊讶的是,您引用的3.8中的“约束”的定义令人惊讶,至少在没有上下文的情况下很难理解(“语法或语义上的限制,通过这些限制来解释语言元素的说明”)。“ Restriction”和“ constraint”是同义词,因此重新措词不会增加太多;什么是“语言元素的说明”?论述是一个具有多种含义的词;让我们Dictionary.com上获取“主要旨在传达信息的文字或语音”,并假设它们是该标准的意思。那么就意味着基本上是一个约束在这个标准就是在这个标准说的一个约束。哇,

根据3.8的约束

实用地检查标准中的实际约束部分表明,它们列出了对符合标准的程序施加的编译时间限制这是有道理的,因为在编译时只能检查编译时约束。这些附加限制是用C语法无法表达的那些限制。1个

约束部分之外的约束

约束部分之外的“应”的大多数用法对符合条件的实现施加了限制示例:“具有静态存储持续时间的所有对象应在程序启动之前初始化(设置为其初始值)”,这是符合要求的实现。

但是,有一些“应”子句在“约束”部分之外对程序(而非实现)施加了限制我会争辩说,大多数都与3.18中提到的“调用库函数时程序的运行时约束”属于同一类别。它们似乎是运行时约束,通常在编译时无法检测到(因此,诊断不是强制性的)。

这里有一些例子。

在6.5 / 7中,n1570详细讨论了备受争议的别名规则:

一个对象只能通过具有以下类型之一的左值表达式访问其存储值:

  • 与对象的有效类型兼容的类型
  • 与对象的有效类型兼容的类型的合格版本,[...]

在6.5.16.1中,“简单分配”:

如果从另一个对象中读取存储在一个对象中的值,而该对象与第一个对象的存储有任何重叠,则该重叠将是精确的。”

其他示例涉及指针算术(6.5.6 / 8)。

约束部分中的子句

但是,还有其他的Will子句在编译时应该可以检测到它们的违背。如果它们出现在相应的“约束”部分中,我不会眨眨眼

  • 6.6 / 6,“整数常量表达式中的转换运算符只能将算术类型转换为整数类型”(在“语义”下);如果无法检测到常量和强制类型转换,在编译时可以检测到什么?
  • 6.7 / 7,“如果声明的对象标识符没有链接,则该对象的类型应在其声明符的末尾完成”(在“语义”下)。对我来说,似乎是检测代码中某个类型是否完整的基本编译器任务。但是,当然,我从未编写过C编译器。

还有更多示例。但是正如我所说,我认为不需要执行即可诊断违规。试图越过编译器的违规程序只会暴露未定义的行为。


1例如,我了解语法不处理类型-它仅具有通用的“表达式”。因此,每个运算符都有一个约束部分,详细说明其参数的允许类型。移位运算符的示例:“每个操作数应具有整数类型。” 试图移位浮点数位的程序违反了此约束,并且实现必须发出诊断信息。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

C ++标准在发布诊断消息时有哪些保证?

标准C ++库中有哪些异常类

如何确定流程具有哪些单独的ulimit约束?

使用Elasticsearch和标准sql查询有哪些用例?

哪些C ++标准库头调用GCC的-pthread选项的要求?

C标准库的哪些部分未包含在C ++标准库中(其余部分)?

C ++ 14标准库的哪些部分可能是什么,哪些部分将被制成constexpr?

.CSX C#文件有哪些用途?

“继续”和“休息”有哪些选择?在C

使用MediaStream Recording API进行最低延迟的音频播放/监视有哪些好的约束条件?

添加约束以便只能插入订单日期可用的项目有哪些不同的方法?

R中字符串到日期的转换有哪些“标准明确日期”格式?

各种C数据类型的“溢出”断言:根据C标准,可以保证哪些断言是正确的?

PULP约束:至少有一个团队满足最低标准

具有多个约束的C ++模板

具有约束的C#模板

哪些命名约束适用于C#条件编译符号?

哪些标准C ++功能可用于查询机器/ OS体系结构?

C 标准的哪些部分证明了整数类型的对应关系?

带有CUDA 6.0的C ++ 11标准

C ++标准库中是否有maxheap?

C标准中可变修改类型的switch语句约束说明

没有 bash -c 的 sudo echo 有哪些替代方法

SQLite找出违反了哪些约束

约束哪些关系模型在何处返回

标准中使用了哪些“类型”的含义?

Apple iOS MapKit提供哪些标准注释?

Python标准库中提供了哪些“工具”

哪些身份属性需要符合 SCIM 标准?