Що означає [N… M] в ініціалізаторах C сукупності?


101

З рядка 123 sys.c :

void *sys_call_table[__NR_syscalls] = 
{
    [0 ... __NR_syscalls-1] = sys_ni_syscall,
#include <asm/unistd.h>
};

sys_call_tableце загальний покажчик на масиви, я можу це бачити. Однак що таке позначення:

[0 ... __NR_syscalls-1]

Що таке ...?


EDIT: Тут
я дізнався ще один фокус C: #include <asm/unistd.h>буде попередньо оброблений та замінений його вмістом та призначений [0 ... _NR_syscalls-1].


2
Ні, це не вказівник на масив, це масив покажчиків. Буде оголошено вказівник на масивvoid (*sys_call_table)[__NR_syscalls]
Патрік Шлютер

@tristopia ви праві. Я мав на увазі вказівник на масиви, подібні до char *argv[]. Виправлено.
Amumu

Відповіді:


90

Це ініціалізація за допомогою призначених ініціалізаторів .

Ініціалізація на основі діапазону - це розширення gnu gcc.

Щоб ініціалізувати діапазон елементів на одне значення, напишіть [first ... last] = value. Це розширення GNU. Наприклад,

 int widths[] = { [0 ... 9] = 1, [10 ... 99] = 2, [100] = 3 };

Він не портативний. Компіляція з-pedantic з, скажу вам так.

Як це працює тут?
Препроцесор замінює #include <asm/unistd.h>його фактичним вмістом ( він визначає різні символічні константи та типи та оголошує різні функції ) у структурі на основі діапазону, які далі використовуються для ініціалізації масиву покажчиків.


Здається, це не портативно. Чи є?
Івайло Страндєв

5
@Mehrdad чи компілятор microsoft c відповідає стандарту c99? Я відпочиваю тут своєю справою ... c99
Aftnix

3
@Mehrdad: Насправді, лише конструкція на основі діапазону призначених ініціалізаторів є розширенням gcc. Самі визначені ініціалізатори дозволені стандартом C.
Алок Зберегти

2
@Mehrdad: Вибачте, я не бажаю бути частиною жодної принади полум'я, мій намір полягав лише в тому, щоб прояснити тонку деталь, яку я вважав, що ви неправильно зрозуміли.
Алок Зберегти

2
@Mehrdad: Щоб було зрозуміло, конструкція діапазону переноситься лише на gcc (і компілятори, які реалізують її розширення), а призначені ініціалізатори взагалі переносяться лише компіляторам, які підтримують C99 (або принаймні цю особливість).
Кіт Томпсон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.