В источнике ядра Linux есть много литералов массивов, таких как:
enum {
FOO,
BAR
};
static const char* const names[] = {
[FOO] = "foo", /* wtf is this? */
[BAR] = "bar",
};
Здесь каждая строка явно указывает индекс внутри массива поставленного значения вместо того, чтобы полагаться на упорядочение.
Я не знаю фразу для поиска - что это называется? Какой стандарт определяет его? (Или это расширение GNU?) Могу ли я сделать это на С++ или просто C? Экспериментируя с gcc
, я найду с приведенным выше в test.c
,
$ gcc --version
gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
Copyright (C) 2011 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE
эти команды возвращают успех:
$ gcc -Wall -c test.c
$ gcc -Wall -c --std=c90 test.c
$ gcc -Wall -c --std=gnu90 test.c
$ gcc -Wall -c --std=iso9899:1990 test.c
$ gcc -Wall -c --std=c1x test.c
и эти команды терпят неудачу с различными жалобами на лямбда и operator=
:
$ g++ -Wall -c test.c
$ g++ -Wall -c --std=c++98 test.c
$ g++ -Wall -c --std=gnu++98 test.c
$ g++ -Wall -c --std=c++0x test.c
$ g++ -Wall -c --std=gnu++0x test.c
Это говорит о том, что это действительно C (практически в любом диалекте), но не С++. Но я настроен скептически. Я не помню, чтобы это использовалось где угодно, кроме ядра Linux. Я также не вижу в нем, например, этого списка конструкций, действительных в C, но не С++.