在某些违反类型标识规则(on ideone)的代码下面:
#include <iostream>
void foo()
{
typedef int I;
extern I a; //now a is denoting an entity, which is a member of global scope
std::cout << a;
}
typedef char I;
I a; //definition of a
int main()
{
foo();
}
类型识别规则(第3.6 / 10号N3797):
在所有类型调整之后(typedefs(7.1.3)期间) 由他们的定义代替),由所有人指定的类型 引用给定变量或函数的声明应为 相同,但数组对象的声明可以指定 数组类型因主要数组的存在与否而不同 约束(8.3.4)。 违反此规则的类型标识 需要诊断。
我理解违反该规则不需要诊断。但为什么不呢?
答案 0 :(得分:0)
引用的规则意味着您的违规行为会调用未定义的行为。
不完全指定行为的原因是:
在您的情况下,大多数对象文件类型将不包含诊断错误的必要信息(如果它分布在多个实现单元中)。
这使得很难诊断出来。
无论如何,由于C ++不包含任何访问具有相同名称的不同对象的方法,因此将这些信息放入目标文件中并不是一个好主意,特别是因为链接器必须知道所有 C ++用于例外和角落案例的规则。