每个人都知道如何与常量元素声明一个数组:常量元素与恒定阵列
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
有相同的类型或不同的类型?
显然,它也可以声明一个数组,它是本身恒定
不。在N1256中,§6.7.3/ 8:
如果数组类型的规范包含任何类型限定符,则元素类型是如此限定的,而不是数组类型。 118)
然后脚注118表示:
这两个可以通过使用的
typedefs
发生。
他们有相同的类型,虽然铛会打印他们不同。由于阵列本身不能是const
,所以它被认为是“通过”。
对于non-typedefed版本,clang将类型打印为const int [10]
。对于typedef版本,它打印int const[10]
。这两者都是相同的。
了一些测试:
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
都具有相同的大小,既当作为参数传递转换为同一类型。两者都不是指针。两者都是数组。
通过代码分析和测试 - 它们是相同的类型。
根据定义,它们也是同一类型! –
无论如何,数组不能分配*。 – EOF
一个数组可以有常量元素,数组的大小是编译时间常量..但常数数组甚至意味着什么? M好奇。 –
常量和常量在C中有不同的含义。 – 2501