这是合法的C / C ++吗? `int * p =(int []){1,2,3};`

时间:2012-01-14 09:13:21

标签: c++ c arrays standards literals

This answer of mine产生了一些评论,声称以下构造不是合法的C / C ++:

void f (int* a) ;
f ((int[]){1,2,3,4,0}) ;

(有关完整计划,请参阅this ideone link)。但我们无法解决这个问题。任何人都可以对此有所了解吗?各种标准有什么用呢?

3 个答案:

答案 0 :(得分:9)

据我所知,它是有效的C99 - 它传递的是复合文字。

C99标准以此为例(§6.5.2.5/ 9):

  

示例1文件范围定义

int *p = (int []){2, 4};
  

将p初始化为指向两个整数数组的第一个元素,第一个元素的值为2,第二个元素的值为4。此复合文字中的表达式必须是常量。未命名的对象具有静态存储持续时间。

请注意,此处(int [])不是演员。

这不是一个有效的C ++构造,复合文字不是C ++标准的一部分(包括C ++ 11)。一些编译器允许它作为扩展。 (GCC会这样做,通过-Wall -pedantic进行诊断.IBM xlC allows it as an extension too。)

答案 1 :(得分:1)

作为参数传递给函数的表达式是复合文字的示例。这些在C99中是合法的,但在C ++ 98中则不合适。

请参阅N897 "A draft rationale for the C99 standard."中的第6.4.4节“常量”和6.8“语句和块”的示例。另请参阅GCC文档的this section

答案 2 :(得分:-1)

嗯,我认为根据C ++ 11它是有效的。第5.2节:

postfix-expression:
    ...
    typename-specifier ( expression-listopt )
    simple-type-specifier braced-init-list
    typename-specifier braced-init-list
    ...
expression-list:
    initializer-list

修改 经过一些阅读后,我得出结论它实际上是无效,因为你不能像这样使用后缀表达式。应该有一些主要的表达方式。