全局数组定义了两次但仍在编译?
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"
在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 atypedef
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"