每个人都知道如何声明具有常量元素的数组:
const int a[10];
显然,也可以通过typedef
声明一个 它本身 就是常量的数组:
typedef int X[10];
const X b;
从技术和实际角度来看,
a
和b
是相同类型还是不同类型?每个人都知道如何声明具有常量元素的数组:
const int a[10];
显然,也可以通过typedef
声明一个 它本身 就是常量的数组:
typedef int X[10];
const X b;
a
和b
是相同类型还是不同类型?const
, 因此被称为"fall through"。const int [10]
。对于typedef版本,它打印int const[10]
。两者都是等价的。
Coliru in action。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
这两个变量大小相同,当作为参数传递时会转换为相同的类型。它们都不是指针,而是数组。
通过代码分析和测试,它们被认为是相同类型。