Каковы эти странные размеры массива [*] и [статические] в C99?
Видимо, следующие прототипы функций действительны в C99 и C11:
void foo(int a[const *]);
void bar(int a[static volatile 10]);
Какова цель этих странных нижних обозначений *
, static
и резюме?
Помогают ли они отличить статически типизированные массивы от массивов переменной длины? Или это просто синтаксический сахар?
1 ответ
статический в объявителе массива параметров
void f(int a[static 10]);
static
здесь указывается, что параметр a
это указатель на int
но этот массив объект (где a
является указателем на его первый элемент) имеет по крайней мере 10
элементы.
Компилятор имеет право предполагать f
аргумент не NULL
и, следовательно, он может выполнить некоторые оптимизации. gcc
в настоящее время не выполняет оптимизацию ( источник):
"Информация, предоставляемая static в объявлениях массива параметров, не используется для оптимизации. Возможно, имеет смысл использовать ее в будущем в сочетании с работой по предварительной выборке".
квалификатор в деклараторе массива параметров
void g(int a[cvr 10]);
внутри g
a
это указатель cvr на int
(резюме const
, volatile
или же restrict
Классификатор). Например, с const
это значит a
это const
указатель на int
(т.е. тип int * const
).
Итак, объявление параметра:
T param[cvr e]
совпадает с объявлением параметра:
T * cvr param
* в массиве параметров
void h(int a[*]);
[*]
в объявлении параметра формального массива в объявлении функции (которое не является частью определения функции) указывает, что формальный массив является массивом переменной длины.