我引用ANSI_ISO + 9899-1990,在所有未定义行为列表中 -
- 使用在当前范围内不可见的标识符
为什么使用未定义的变量UB而不是错误?我想知道这背后的原因吗?制作一切不正确的东西是否有效"作为UB?
我知道大多数编译器都将其视为错误。但是为什么标准会这样说呢?
或者没有"错误"在标准? c的语法是。*但是它的某些部分有UB?
答案 0 :(得分:6)
不,标准中存在很多错误概念,只是并非一切都算错误。我预先说两件可以帮助你的事情:
C89 / 90是编纂现有的练习,不是来创建新语言。这意味着,即使它们没有意义,有时也必须妥协。
C99 + 不有限制,所以某些事情可以清理干净。事实上,由于你引用的那个文字似乎在C99中消失了,这可能是清理过的事情之一。
回到推理,ANSI C89基本原理文件有这样的说法:
一个争议的来源是,即使在一个区块内引入,带有外部链接的标识符是否应该具有文件范围。基础文档在这一点上含糊不清, 的解释因不同的实现 而有所不同。例如,以下片段在文件范围方案中有效,而在块范围方案中无效:
typedef struct data d_struct ;
first(){
extern d_struct func();
/* ... */
}
second(){
d_struct n = func();
}
虽然人们普遍认为,一旦外部声明超出范围,利用外部声明是不好的做法,但有些人认为翻译人员必须记住检查声明,所以为什么不承认呢? 所采用的折衷方案基本上是禁止范围规则适用,但是符合要求的实现不需要诊断重新声明超出范围的外部标识符(未定义的行为)。 < /强>
几乎可以肯定的是,短语&#34;已被不同的实施方式解释不同&#34;这导致他们将其标记为UB而不是错误。请注意,这里不是范围,只是实现是否需要报告您尝试使用它的事实。