常数元素与常数数组

时间:2016-05-26 14:51:40

标签: c arrays const typedef

每个人都知道如何使用常量元素声明数组:

const int a[10];

显然,也可以通过typedef声明一个本身的数组:

typedef int X[10];
const X b;

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

3 个答案:

答案 0 :(得分:4)

它们具有相同的类型,但clang会以不同的方式打印它们。由于数组本身不能是const,因此可以说是#34;通过"。

对于非typedefed版本,clang将类型打印为const int [10]。对于typedef版本,它会打印int const[10]。这两者都是等价的。

Coliru in action

答案 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

两者都具有相同的大小,并且在作为参数传递时都转换为相同的类型。也不是指针。两者都是数组。

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