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