Какова цель статического ключевого слова в параметре массива функции типа "char s [статические 10]"? - PullRequest
127 голосов
/ 07 августа 2010

При просмотре исходного кода я наткнулся на функцию, подобную этой:

void someFunction(char someArray[static 100])
{
    // do something cool here
}

При некоторых экспериментах кажется, что там тоже могут появиться другие классификаторы:

void someFunction(char someArray[const])
{
    // do something cool here
}

Похоже, что классификаторыразрешены только внутри [ ], когда массив объявлен как параметр функции.Что они делают?Чем он отличается для параметров функции?

1 Ответ

112 голосов
/ 07 августа 2010

Первое объявление сообщает компилятору, что someArray имеет длину как минимум 100 элементов. Это может быть использовано для оптимизации. Например, это также означает, что someArray никогда не равно NULL.

Обратите внимание, что стандарт C не требует, чтобы компилятор диагностировал, когда вызов функции не удовлетворяет этим требованиям (т. Е. Это молчаливое неопределенное поведение).

Второе объявление просто объявляет someArray (не someArray 's элементы!) Как const, то есть вы не можете написать someArray=someOtherArray. Это так же, как если бы параметр был char * const someArray.

Этот синтаксис может использоваться только внутри самого внутреннего [] объявления массива в списке параметров функции, он не будет иметь смысла в других контекстах.

Стандартный текст, который охватывает оба вышеупомянутых случая, находится в C11 6.7.6.3/7 (был 6.7.5.3/7 в C99):

Объявление параметра как «массива типа» должно быть скорректировано на «квалифицированный указатель на тип», где квалификаторы типа (если таковые имеются) - те, которые указаны в [ и ] вывод типа массива. Если ключевое слово static также присутствует в пределах [ и ] деривации типа массива, то для каждого вызова функции значение соответствующего фактического аргумента должно обеспечивать доступ к первому элементу массива, по крайней мере, как много элементы, указанные в выражении размера.

...