我使用g ++(7.1)和clang ++(xcode 9.0)编译了以下程序-std=c++11 -Wall并获得结果:
克++
0x10052c050
0x10052c040
0x10052c040
Run Code Online (Sandbox Code Playgroud)
铛++
0x108b74024
0x108b74018
0x108b74018
Run Code Online (Sandbox Code Playgroud)
这意味着extern int a[];和static int a[3];声明相同的实体并具有相同的链接(内部链接).
//a.cpp
#include <stdio.h>
int a[3];
void f()
{
printf("%p\n", (void*)a);
};
//b.cpp
extern void f();
static int a[3];
void g()
{
printf("%p\n", (void*)a);
extern int a[];
printf("%p\n", (void*)a);
}
int main(int argc, char* argv[])
{
f();
g();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但是,在C++ 11 [3.9/6]中:
...数组对象的声明类型可能是一个未知大小的数组,因此在翻译单元的某一点不完整,稍后会完成; 这两个点的数组类型("T的未知边界数组"和"NT数组")是不同的类型....
int a[3];并且int a[];是不同的类型,
在C++ 11 [3.5/6]中:
如果与具有相同名称和类型关联实体的可见声明,忽略了最内层的命名空间范围之内声明的实体, …