Первое объявление сообщает компилятору , что someArray
является , по меньшей мере длиной 100 элементов. Это можно использовать для оптимизации. Например, это также означает, что someArray
никогда NULL
.
Обратите внимание, что стандарт C не требует, чтобы компилятор диагностировал, когда вызов функции не соответствует этим требованиям (т. Е. Это молчаливое поведение undefined).
Второе объявление просто объявляет someArray
(не someArray
элементы!) Как const, т. Е. Вы не можете писать someArray=someOtherArray
. Это так же, как если бы параметр былchar * const someArray
.
Этот синтаксис можно использовать только в самой внутренней []
части декларатора массива в списке параметров функции; в других контекстах это не имело бы смысла.
Стандартный текст, который охватывает оба вышеупомянутых случая, находится в C11 6.7.6.3/7 (было 6.7.5.3/7 в C99):
Объявление параметра как «массив типа» должно быть скорректировано как «квалифицированный указатель на тип», где квалификаторы типа (если есть) - это те, которые указаны в пределах [
и ]
для производного типа массива. Если ключевое слово static также появляется внутри [
и ]
для производного типа массива, то для каждого вызова функции значение соответствующего фактического аргумента должно обеспечивать доступ к первому элементу массива, содержащему по крайней мере столько элементов, сколько указано в выражение размера.
int foo(struct bar [static 1]);
вместоint foo(struct bar *);
подписи для функций, которые не принимают указатели NULL. (Я знаю, что у gcc есть альтернативный нестандартный синтаксис для пометки таких функций, чтобы компилятор мог выдавать предупреждения ..)clang
теперь правильно предупреждает, когда вы пытаетесь передать аргумент с известным NULL в функцию с[static 1]
объявлением параметра.if (!someArray) { somecode... }
может быть удален