2016-05-26 33 views
4

每个人都知道如何与常量元素声明一个数组:常量元素与恒定阵列

const int a[10]; 

显然,它也可以声明一个数组,它是本身常数,经由typedef

typedef int X[10]; 
const X b; 

从技术和实践的角度来看,ab有相同的类型或不同的类型?

+5

无论如何,数组不能分配*。 – EOF

+0

一个数组可以有常量元素,数组的大小是编译时间常量..但常数数组甚至意味着什么? M好奇。 –

+1

常量和常量在C中有不同的含义。 – 2501

回答

4

显然,它也可以声明一个数组,它是本身恒定

不。在N1256中,§6.7.3/ 8:

如果数组类型的规范包含任何类型限定符,则元素类型是如此限定的,而不是数组类型。 118)

然后脚注118表示:

这两个可以通过使用的typedefs发生。

4

他们有相同的类型,虽然铛会打印他们不同。由于阵列本身不能是const,所以它被认为是“通过”。

对于non-typedefed版本,clang将类型打印为const int [10]。对于typedef版本,它打印int const[10]。这两者都是相同的。

Coliru in action

1

了一些测试:

typedef int X[10]; 

#define typeinfo(t) _Generic((t), \ 
    X: "int X[10]", \ 
    int: "int", \ 
    int *: "int *", \ 
    const int *: "const int *", \ 
    default: "not" \ 
) 

int main(void) { 
    const int a[10]; 
    const X b; 

    printf("%zu\n", sizeof (const int *)); 
    puts(typeinfo(a)); 
    puts(typeinfo(b)); 
    printf("%zu\n", sizeof a); 
    printf("%zu\n", sizeof b); 
    puts(typeinfo(a[0])); 
    puts(typeinfo(b[0])); 
    printf("%zu\n", sizeof a[0]); 
    printf("%zu\n", sizeof b[0]); 
} 

输出

4 
const int * 
const int * 
40 
40 
int 
int 
4 
4 

都具有相同的大小,既当作为参数传递转换为同一类型。两者都不是指针。两者都是数组。

通过代码分析和测试 - 它们是相同的类型。

+0

根据定义,它们也是同一类型! –