2017-02-14 97 views
3

的阵列我们大概知道C99 designated initializers,它们可以被用来初始化大常量数组的方式:指定初始化数组

const int vals[] = { 
    [0] = 10, 
    [10] = 12 
} 

哪个initalizes的vals指数010vals12指数10

我的问题是如何使用这种风格的指定初始化器阵列的数组。这里是我的示例代码:

typedef enum { 
    COMMON = 0, 
    STRINGS, 
    KEY, 
    PRECUSSIVE, 
    GUITAR, 
    KEYBOARD, 
    BASS, 
    PIANO, 
    DRUMS, 
    _INST_MAX 
} instrument_classification_t; 
    static const int * const instrument_class_hierarchy[] = { 
    [COMMON] = {STRINGS, KEY, PRECUSSIVE, _INST_MAX}, 
    [STRINGS] = {GUITAR, BASS, _INST_MAX}, 
    [KEY] = {PIANO, KEYBOARD, _INST_MAX}, 
    [PRECUSSIVE] = {DRUMS, _INST_MAX}, 
    [GUITAR] = NULL, 
    [KEYBOARD] = NULL, 
    [BASS] = NULL, 
    [PIANO] = NULL, 
    [DRUMS] = NULL 
}; 

但我得到这些警告,这意味着初始化只使用第一个元素。

main.c:166:3: warning: braces around scalar initializer 
    [COMMON] = {STRINGS, KEY, PRECUSSIVE, _INST_MAX}, 
^
main.c:166:3: note: (near initialization for 'instrument_class_hierarchy[0]') 
main.c:166:15: warning: initialization makes pointer from integer without a cast [-Wint-conversion] 
    [COMMON] = {STRINGS, KEY, PRECUSSIVE, _INST_MAX}, 
     ^
main.c:166:15: note: (near initialization for 'instrument_class_hierarchy[0]') 
main.c:166:24: warning: excess elements in scalar initializer 
    [COMMON] = {STRINGS, KEY, PRECUSSIVE, _INST_MAX}, 
        ^
main.c:166:24: note: (near initialization for 'instrument_class_hierarchy[0]') 
main.c:166:29: warning: excess elements in scalar initializer 
    [COMMON] = {STRINGS, KEY, PRECUSSIVE, _INST_MAX}, 
         ^
main.c:166:29: note: (near initialization for 'instrument_class_hierarchy[0]') 
main.c:166:41: warning: excess elements in scalar initializer 
    [COMMON] = {STRINGS, KEY, PRECUSSIVE, _INST_MAX}, 
            ^
main.c:166:41: note: (near initialization for 'instrument_class_hierarchy[0]') 
main.c:167:3: warning: braces around scalar initializer 
    [STRINGS] = {GUITAR, BASS, _INST_MAX}, 
^
main.c:167:3: note: (near initialization for 'instrument_class_hierarchy[1]') 
main.c:167:16: warning: initialization makes pointer from integer without a cast [-Wint-conversion] 
    [STRINGS] = {GUITAR, BASS, _INST_MAX}, 
      ^
main.c:167:16: note: (near initialization for 'instrument_class_hierarchy[1]') 
main.c:167:24: warning: excess elements in scalar initializer 
    [STRINGS] = {GUITAR, BASS, _INST_MAX}, 
        ^
main.c:167:24: note: (near initialization for 'instrument_class_hierarchy[1]') 
main.c:167:30: warning: excess elements in scalar initializer 
    [STRINGS] = {GUITAR, BASS, _INST_MAX}, 
         ^
main.c:167:30: note: (near initialization for 'instrument_class_hierarchy[1]') 
main.c:168:3: warning: braces around scalar initializer 
    [KEY] = {PIANO, KEYBOARD, _INST_MAX}, 
^
main.c:168:3: note: (near initialization for 'instrument_class_hierarchy[2]') 
main.c:168:12: warning: initialization makes pointer from integer without a cast [-Wint-conversion] 
    [KEY] = {PIANO, KEYBOARD, _INST_MAX}, 
     ^
main.c:168:12: note: (near initialization for 'instrument_class_hierarchy[2]') 
main.c:168:19: warning: excess elements in scalar initializer 
    [KEY] = {PIANO, KEYBOARD, _INST_MAX}, 
      ^
main.c:168:19: note: (near initialization for 'instrument_class_hierarchy[2]') 
main.c:168:29: warning: excess elements in scalar initializer 
    [KEY] = {PIANO, KEYBOARD, _INST_MAX}, 
         ^
main.c:168:29: note: (near initialization for 'instrument_class_hierarchy[2]') 
main.c:169:3: warning: braces around scalar initializer 
    [PRECUSSIVE] = {DRUMS, _INST_MAX}, 
^
main.c:169:3: note: (near initialization for 'instrument_class_hierarchy[3]') 
main.c:169:19: warning: initialization makes pointer from integer without a cast [-Wint-conversion] 
    [PRECUSSIVE] = {DRUMS, _INST_MAX}, 
      ^
main.c:169:19: note: (near initialization for 'instrument_class_hierarchy[3]') 
main.c:169:26: warning: excess elements in scalar initializer 
    [PRECUSSIVE] = {DRUMS, _INST_MAX}, 

回答

7

值的支撑列表无法初始化指针。你的错误是一样的:

int *p = { 1, 2, 3 }; 

你可以使用一个复合文字来代替:

// ... 
[COMMON] = (const int[]){STRINGS, KEY, PRECUSSIVE, _INST_MAX}, 

这是假定该代码是在文件范围内(即在任何函数之外),这意味着复合文字具有静态存储时间,因此指向它们是安全的。如果你的代码实际上在一个函数内,你需要声明单独的静态数组或者做一些其他修改。

+0

感谢您的回答!我不知何故错过了它。我想知道如果我可以在没有声明单独的静态数组的情况下在函数范围内拥有所有这些定义,我是否可以有你的意见。 我没有其他理由让它们成为全局的,因为在我的项目中有这样的多个定义,它们都不需要在全局范围内。 – milaniez

+1

@milaniez你可以删除'static'(假设你的函数没有返回指向复合文字的指针)。除此之外,如果保持代码整洁,将它们移动到文件范围并没有什么实际坏处。 –