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

Во время просмотра некоторого исходного кода я столкнулся с такой функцией:

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

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

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

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

Ответ 1

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

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

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

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

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

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