Каковы эти странные размеры массива [*] и [статические] в 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]);

внутри ga это указатель cvr на int (резюме const, volatile или же restrict Классификатор). Например, с const это значит a это const указатель на int (т.е. тип int * const).

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

T param[cvr e] 

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

T * cvr param

* в массиве параметров

void h(int a[*]);

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

Другие вопросы по тегам