Какова цель статического ключевого слова в параметре массива функции типа "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 не требует, чтобы компилятор диагностировал, когда вызов функции не удовлетворяет этим требованиям (т. Е. Это молчаливое неопределенное поведение).
Вторая декларация просто объявляет someArray
(не someArray
это элементы!) как const, т.е. нельзя писать someArray=someOtherArray
, Это так же, как если бы параметр был char * const someArray
,
Этот синтаксис можно использовать только внутри самого []
объявления массива в списке параметров функции, это не имело бы смысла в других контекстах.
Стандартный текст, который охватывает оба вышеупомянутых случая, находится в C11 6.7.6.3/7 (был 6.7.5.3/7 в C99):
Объявление параметра как "массива типа" должно быть скорректировано на "квалифицированный указатель на тип", где квалификаторы типа (если таковые имеются) - те, которые указаны в
[
а также]
вывода типа массива. Если ключевое слово static также отображается внутри[
а также]
затем для каждого вызова функции значение соответствующего фактического аргумента должно обеспечивать доступ к первому элементу массива, по крайней мере, с таким количеством элементов, как указано в выражении размера.