0
使用C99我試圖在函數中做到這一點:C結構數組初始化鑄造
foo_t foos[4];
foos[0] = {1, {1,2}};
不起作用。所以我試了這個...
foo_t foos[4];
foos[0] = (foo_t){1, {1,2}};
哪個有效,但是安全嗎?有沒有更好的方法來做到這一點?
使用C99我試圖在函數中做到這一點:C結構數組初始化鑄造
foo_t foos[4];
foos[0] = {1, {1,2}};
不起作用。所以我試了這個...
foo_t foos[4];
foos[0] = (foo_t){1, {1,2}};
哪個有效,但是安全嗎?有沒有更好的方法來做到這一點?
第一種情況失敗了,因爲沒有類型與表達式(括號內的初始化)
是的,第二代碼是安全相關聯,只要初始化列表的預期類型的LHS匹配。這稱爲compound literal,FWIW。
引用C11
,章§6.5.2.5
,它由一個括號類型名稱後面初始化的一支柱封閉 列表的後綴表達式是字面的化合物。它提供了一個未命名的對象,其值由初始化程序列表給出。
如果你告訴我們foo_t的定義是什麼,這將有所幫助。 – ScottK
你可以這樣做:'foo_t foos [4] = {{1,{1,2}}};'。雖然這不完全等同於你已經顯示的,因爲它不是初始化索引1-3的元素,而你的例子沒有。 – kaylum
在實際的代碼中,foos []數組位於一個更大的結構數組中(並且內部包含更多的低級結構),所以我不能在聲明期間執行一次賦值,因爲結果過多的嵌套會使整個桌子一團亂七八糟。 – user2418731