2012-07-01 43 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 *作为类型。 –