This answer of mine产生一些评论声称下面的结构是不合法的C/C++:这是合法的C/C++吗? `INT * P =(INT []){1,2,3};`
void f (int* a) ;
f ((int[]){1,2,3,4,0}) ;
(参见this ideone link一个完整的程序)。但我们无法解决问题。任何人都可以解释这一点吗?各种标准有什么要说的?
This answer of mine产生一些评论声称下面的结构是不合法的C/C++:这是合法的C/C++吗? `INT * P =(INT []){1,2,3};`
void f (int* a) ;
f ((int[]){1,2,3,4,0}) ;
(参见this ideone link一个完整的程序)。但我们无法解决问题。任何人都可以解释这一点吗?各种标准有什么要说的?
据我所知,这是有效的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方xIC allows it as an extension too。)
请注意,数组对象只有在文件范围时才具有静态存储持续时间,如示例中所示。如果它出现在一个函数定义中,则它具有与封闭块相关联的自动存储持续时间(即,当执行到达封闭的'}'时,该对象和它的任何指针变为无效)。这不像字符串文字,它总是有静态的存储时间。 – 2012-01-14 09:43:04
谢谢!这似乎涵盖了一切。 – TonyK 2012-01-14 09:48:12
'char * p =(char []){'s','t','r','i','n','g',0}'有什么存储时间? – hirschhornsalz 2012-01-14 09:55:54
嗯,我认为这是有效的根据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
编辑: 一些更多的阅读后,我来总结它实际上无效,因为你不能使用后缀表达这样。应该有一些主要的表达。
您可以引用。我没有看到任何有效的东西。 – 2012-01-14 09:29:49
您发布的代码段与问题不符。如果你有兴趣,这种类型的转换语法在§5.4而不是§5.2中。您还应该阅读所允许的转换,并且您将发现不允许将其转换为数组类型。 – 2012-01-14 09:36:11
@R。马丁霍费尔南德斯:现在我很困惑。我想'typename-specifier braced-init-list'可以写成eq。作为'sometype {1,2,3,4}',但gcc不允许我这样做。这是只适用于结构,还是我完全错了? – stativ 2012-01-14 09:47:01
作为参数传递给函数的表达式是的化合物字面一个例子。这些在C99中是合法的,但不在C++ 98中。
例如参见N897 "A draft rationale for the C99 standard."的6.4.4节“常量”和6.8“语句和块”,另请参阅GCC文档的this section。
我认为@Nicol Bolas是对的,谁对你的帖子发表了评论。并非所有的工作都是有效的。实际情况往往如此。我会说在你的评论结果中的片段“未定义的行为”。所以如果你想证明他是合法的,你必须在c/C++/C++ 11标准中抓取/搜索。 – poitroae 2012-01-14 09:20:54
@迈克尔:我不想证明这是合法的,我只是想知道它是否合法。我对帖子的评论(包括我的评论)只是意见。 – TonyK 2012-01-14 09:22:34
为什么它是未定义的行为? – 2012-01-14 09:26:06