2012-01-14 34 views
9

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一个完整的程序)。但我们无法解决问题。任何人都可以解释这一点吗?各种标准有什么要说的?

+0

我认为@Nicol Bolas是对的,谁对你的帖子发表了评论。并非所有的工作都是有效的。实际情况往往如此。我会说在你的评论结果中的片段“未定义的行为”。所以如果你想证明他是合法的,你必须在c/C++/C++ 11标准中抓取/搜索。 – poitroae 2012-01-14 09:20:54

+0

@迈克尔:我不想证明这是合法的,我只是想知道它是否合法。我对帖子的评论(包括我的评论)只是意见。 – TonyK 2012-01-14 09:22:34

+0

为什么它是未定义的行为? – 2012-01-14 09:26:06

回答

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方xIC allows it as an extension too。)

+2

请注意,数组对象只有在文件范围时才具有静态存储持续时间,如示例中所示。如果它出现在一个函数定义中,则它具有与封闭块相关联的自动存储持续时间(即,当执行到达封闭的'}'时,该对象和它的任何指针变为无效)。这不像字符串文字,它总是有静态的存储时间。 – 2012-01-14 09:43:04

+0

谢谢!这似乎涵盖了一切。 – TonyK 2012-01-14 09:48:12

+0

'char * p =(char []){'s','t','r','i','n','g',0}'有什么存储时间? – hirschhornsalz 2012-01-14 09:55:54

-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 

编辑: 一些更多的阅读后,我来总结它实际上无效,因为你不能使用后缀表达这样。应该有一些主要的表达。

+1

您可以引用。我没有看到任何有效的东西。 – 2012-01-14 09:29:49

+0

您发布的代码段与问题不符。如果你有兴趣,这种类型的转换语法在§5.4而不是§5.2中。您还应该阅读所允许的转换,并且您将发现不允许将其转换为数组类型。 – 2012-01-14 09:36:11

+0

@R。马丁霍费尔南德斯:现在我很困惑。我想'typename-specifier braced-init-list'可以写成eq。作为'sometype {1,2,3,4}',但gcc不允许我这样做。这是只适用于结构,还是我完全错了? – stativ 2012-01-14 09:47:01

相关问题