說我有一個struct typedef是:
typedef struct {
int32_t memberOne;
int32_t memberTwo;
} myStruct_t;
const我按如下方式實體化該型別的 a:
const myStruct_t myConst = {.memberTwo = 32};
C 說編譯器應該設定memberOne為什么?當然,我已經嘗試過了,而且我碰巧在我嘗試過的編譯器上得到了 0,我在這里追求的是 C 標準是否需要a 的未初始化成員const struct由編譯器初始化為某種東西或其他東西,即上面的代碼會被認為是可移植的嗎?C99 的第 6.7.9 條說:
如果具有靜態或執行緒存盤持續時間的物件未顯式初始化,則:
— 如果它具有指標型別,則將其初始化為空指標;
— 如果它具有算術型別,則將其初始化為(正或無符號)零;
— 如果是聚合,則每個成員都根據這些規則(遞回地)初始化,并且任何填充都被初始化為零位;
— 如果是聯合,則根據這些規則(遞回)初始化第一個命名成員,并將任何填充初始化為零位;
...但是consts 呢?它們是否被認為是static存盤型別,只是沒有static關鍵字?
uj5u.com熱心網友回復:
C 標準是否要求將 const 結構的未初始化成員初始化為某些東西
是的,只要您明確初始化至少一個成員,就可以保證將它們設定為零/空指標。const不參與其中。
您已經找到了有關如何初始化具有靜態存盤持續時間的物件的相關部分。繼續閱讀同一章節:
C17 6.7.9 §19
初始化應按初始化程式串列順序進行,為特定子物件提供的每個初始化程式都將覆寫同一子物件的任何先前列出的初始化程式;所有未顯式初始化的子物件都應隱式初始化,與具有靜態存盤持續時間的物件相同。
C17 6.7.9 §21
如果大括號括起來的串列中的初始值設定項少于聚合的元素或成員,或者用于初始化已知大小陣列的字串文字中的字符少于陣列中的元素,則聚合的其余部分應隱式初始化與具有靜態存盤持續時間的物件相同。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/473140.html
