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