全局数组定义了两次但仍在编译?

Global array defined twice but still compiling?

在a.h中,我错误地创建了一个没有extern关键字的数组,这应该导致一个暂定定义

a.h:

    MyStruct myArrayOfStructs [];

这个数组然后定义在a.cpp

a.cpp:

MyStruct myArrayOfStructs[CONSTANT];

这令人惊讶地编译。

为什么编译器没有抱怨重新定义?

完全正确。第一个 (.h) 说某处存在一个数组,但没有实例化它。

第二次分配。

您可以用暂定定义引用暂定定义,在这种情况下,先前的暂定定义将被视为外部定义。在这种情况下,一个是完整类型而另一个是不完整类型这一事实并不重要。

int i;
int i;

是合法的代码。

int i = 5;
int i = 6;

不是合法代码,因为第一个不再是暂定定义

如您所料,这是非法的 C++。

3.1/2:

A declaration is a definition unless it declares a function without specifying the function's body, it contains the extern specifier or a linkage-specification and neither an initializer nor a function-body, it declares a static data member in a class definition, it is a class name declaration, it is an opaque-enum-declaration, it is a template-parameter, it is a parameter-declaration in a function declarator that is not the declarator of a function-definition, or it is a typedef declaration, an alias-declaration, a using-declaration, a static-assert-declaration, an attribute-declaration, an empty-declaration, a using-directive, an explicit instantiation declaration, or an explicit specialization whose declaration is not a definition.

None 这些例外情况适用,因此头文件中的行是定义。

3.1/5:

A program is ill-formed if the definition of any object gives the object an incomplete type.

也许您的编译器提供了 C 的 "tentative declaration" 行为作为扩展。

clang++ says "error: definition of variable with array type needs an explicit size or an initializer"