Какова цель статического ключевого слова в параметре массива функции типа «char s »?

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

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

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

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

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

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

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

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

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

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

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

  • Разница между статическими и частными статическими переменными
  • Почему у нас нет статического метода в (нестационарном) внутреннем classе?
  • глобальная переменная в C статична или нет?
  • Должны ли статические статические методы C #, которые * могут быть статическими?
  • Spring: обслуживание статических ресурсов вне контекста root
  • Как я имитирую статические методы в classе с помощью easymock?
  • Невозможно установить значение поля статического объекта (ошибка LNK2001: неразрешенный внешний символ)
  • Почему глобальные и статические переменные инициализируются значениями по умолчанию?
  • Статический массив против динамического массива в C ++
  • Существует ли static_warning?
  • Статическая переменная шаблона
  • Давайте будем гением компьютера.