数组数组的指定初始化器
Designated Initializer for array of arrays
我们可能知道 c99 中的 designated initializers 以及它们可用于初始化大型 const 数组的方式:
const int vals[] = {
[0] = 10,
[10] = 12
}
将 vals
的索引 0
初始化为 10
并将 vals
的索引 10
初始化为 12
。
我的问题是如何为数组的数组使用这种样式的指定初始化器。这是我的示例代码:
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},
花括号值列表不能初始化指针。您的错误与以下相同:
int *p = { 1, 2, 3 };
您可以改用复合文字:
// ...
[COMMON] = (const int[]){STRINGS, KEY, PRECUSSIVE, _INST_MAX},
这假设代码在文件范围内(即在任何函数之外),这意味着复合文字具有静态存储持续时间,因此可以安全地指向它们。如果您的代码实际上在函数内部,您将需要声明单独的静态数组或进行一些其他修改。
我们可能知道 c99 中的 designated initializers 以及它们可用于初始化大型 const 数组的方式:
const int vals[] = {
[0] = 10,
[10] = 12
}
将 vals
的索引 0
初始化为 10
并将 vals
的索引 10
初始化为 12
。
我的问题是如何为数组的数组使用这种样式的指定初始化器。这是我的示例代码:
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},
花括号值列表不能初始化指针。您的错误与以下相同:
int *p = { 1, 2, 3 };
您可以改用复合文字:
// ...
[COMMON] = (const int[]){STRINGS, KEY, PRECUSSIVE, _INST_MAX},
这假设代码在文件范围内(即在任何函数之外),这意味着复合文字具有静态存储持续时间,因此可以安全地指向它们。如果您的代码实际上在函数内部,您将需要声明单独的静态数组或进行一些其他修改。