每个人都知道如何使用常量元素声明数组:
const int a[10];
显然,也可以通过typedef
声明一个本身的数组:
typedef int X[10];
const X b;
从技术和实践的角度来看,a
和b
具有相同类型或不同类型吗?
答案 0 :(得分:4)
它们具有相同的类型,但clang会以不同的方式打印它们。由于数组本身不能是const
,因此可以说是#34;通过"。
对于非typedefed版本,clang将类型打印为const int [10]
。对于typedef版本,它会打印int const[10]
。这两者都是等价的。
答案 1 :(得分:4)
显然,也可以声明一个本身为常量的数组
不。在N1256中,§6.7.3/ 8:
如果数组类型的规范包含任何类型限定符,则元素类型是限定的,而不是数组类型。 118)
然后脚注118说:
这两种情况都可以通过使用
typedefs
来实现。
答案 2 :(得分: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
两者都具有相同的大小,并且在作为参数传递时都转换为相同的类型。也不是指针。两者都是数组。
通过代码分析和测试 - 它们是相同的类型。