Подтвердить что ты не робот

Каковы эти странные размеры массива [*] и [статические] в C99?

По-видимому, следующие прототипы функций действительны на C99 и C11:

void foo(int a[const *]);

void bar(int a[static volatile 10]);

Какова цель этих странных нотных обозначений *, static и CV-классификаторов?

Помогают ли они различать статически типизированные массивы из массивов переменной длины? Или это просто синтаксический сахар?

4b9b3361

Ответ 1

static в объявлении массива параметров

 void f(int a[static 10]);

static Здесь указывается, что параметр a является указателем на int, но объект objet массива (где a является указателем на его первый элемент) имеет не менее 10 элементов.

Тогда компилятор имеет право предположить, что аргумент f не является NULL, и поэтому он может выполнять некоторые оптимизации. gcc в настоящее время не выполняет оптимизацию (источник):

"Информация, предоставляемая static в объявлениях массива параметров, не используется для оптимизации. Возможно, имеет смысл использовать ее в будущем в связи с работой по предварительной выборке".

определитель в объявлении массива параметров

void g(int a[cvr 10]);

внутри g a является указателем cvr для int (cvr is const, volatile или restrict qualifier). Например, с const это означает, что a является указателем const к int (т.е. Type int * const).

Итак, объявление параметра:

T param[cvr e] 

совпадает с объявлением параметра:

T * cvr param

* в объявлении массива параметров

void h(int a[*]);

[*] в объявлении параметра формального массива в объявлении функции (который не является частью определения функции) указывает, что формальный массив является массивом переменной длины.