2012-01-14 69 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

相關問題