小编che*_*ing的帖子

在C++中extern声明"T的未知数组"

我使用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]中:

如果与具有相同名称和类型关联实体的可见声明,忽略了最内层的命名空间范围之内声明的实体, …

c++ linkage language-lawyer c++11

8
推荐指数
1
解决办法
422
查看次数

标签 统计

c++ ×1

c++11 ×1

language-lawyer ×1

linkage ×1