输入标识规则及其违规

时间:2014-06-27 12:43:04

标签: c++ types undefined-behavior linkage

在某些违反类型标识规则(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)。 违反此规则的类型标识   需要诊断。

我理解违反该规则不需要诊断。但为什么不呢?

1 个答案:

答案 0 :(得分:0)

引用的规则意味着您的违规行为会调用未定义的行为

不完全指定行为的原因是:

  • 易于实施。
  • 该计划的效率。
  • 迎合不同的现有实施。
  • 允许扩展和未来发展。

在您的情况下,大多数对象文件类型将不包含诊断错误的必要信息(如果它分布在多个实现单元中)。
这使得很难诊断出来。

无论如何,由于C ++不包含任何访问具有相同名称的不同对象的方法,因此将这些信息放入目标文件中并不是一个好主意,特别是因为链接器必须知道所有 C ++用于例外和角落案例的规则。