This answer of mine产生了一些评论,声称以下构造不是合法的C / C ++:
void f (int* a) ;
f ((int[]){1,2,3,4,0}) ;
(有关完整计划,请参阅this ideone link)。但我们无法解决这个问题。任何人都可以对此有所了解吗?各种标准有什么用呢?
答案 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
修改强> 经过一些阅读后,我得出结论它实际上是无效,因为你不能像这样使用后缀表达式。应该有一些主要的表达方式。