2012-07-01 45 views
1

是否有效的C聲明一個結構並定義{}中包含的值?是否有效的C聲明一個結構並定義{}中包含的值?

struct name new_name[] { 
    {"value1"}, 
    {"value2"}, 
    {"value3"}, 
} 

其中:

struct name { 
    union { 
     char *value1; 
    } n_u; 

    char *value2; 
} 
+0

將代碼發佈到您的問題中。不要讓依賴外部鏈接的問題變得有意義。更好的是,讓你的問題變得通用。絕對沒有理由鏈接到該文件。發佈相關的語法並詢問「這是否有效的語法?」 – meagar

+0

我試圖發佈代碼,但無法獲得正確的語法來作爲問題接受。 –

+0

將代碼縮進4個空格,或選擇它並單擊'{}'按鈕。現在,你甚至沒有提供行號,只是一個鏈接到600行文件。 – meagar

回答

3

因爲缺少初始化之前等號(也尾隨分號)你已經發布是無效的。否則,這是合法的,但有點難以閱讀,因爲它不會初始化每個字段,也不會使用一整套大括號。在完全支撐的初始化器中,每個數組,結構或聯合的值列表都會有一對大括號。在這種情況下,你有一個結構數組,其中有聯合體,所以應該有3個級別的支撐以達到最佳的可讀性。一切拼寫的等價物是:

struct name new_name[] = { 
    {{"value1"}, NULL}, 
    {{"value2"}, NULL}, 
    {{"value3"}, NULL}, 
}; 
+0

+1爲徹底/最佳實踐的解釋。只是爲了確認這個編譯正確 - 包含char *的結構,然後啓動到字符串文字? – djechlin

+1

此外,除非你需要位字段或者你試圖做一些有趣的事情,比如強迫你的成員對齊字邊界,否則在聲明1成員聯合中並沒有真正的意義。在這種情況下無關緊要,因爲你的聯合有一個'char *'成員,所以無論如何它都是4或8個字節。 – dcow

+0

@djechlin是的,它允許用字符串文字初始化char *。該字符串將被放置在一個單獨的內存區域中,該內存區域可能不可寫,因此如果可以的話,最好使用const char *作爲類型。 –