C99 представила новую нотацию аргумента функции, в которой ключевое слово static
может использоваться для указания того, что аргумент имеет как минимум N элементов.
6.7.6.3 Деклараторы функций, p7
Объявление параметра как «массив типа» должно быть изменено на «квалифицированный указатель на тип», где квалификаторы типа (если есть) - те, которые указаны в [и] производного типа массива. Если ключевое слово stati c также появляется внутри [и] производного типа массива, то для каждого вызова функции значение соответствующего фактического аргумента должно обеспечивать доступ к первому элементу массива с как минимум таким же количеством элементы, как указано в выражении размера.
Например,
void func(int x[static 10])
{
/* something */
}
говорит, что x имеет не менее 10 элементов. Но это не ограничение, и поэтому компилятор не обязан выдавать диагностику c.
Обоснование C99 по этому поводу:
[..] В некоторых системах для транслятора было бы значительным преимуществом инициировать в начале функции предварительную выборку или загрузку массивов, на которые будут ссылаться параметры. В C89 пользователь не может предоставить переводчику информацию о том, сколько элементов гарантированно будет доступно.
В C99 использование ключевого слова stati c в:
void fadd(double a[static 10], const double b[static 10]) {
int i;
for (i = 0; i < 10; i++) {
if (a[i] < 0.0)
return;
a[i] += b[i];
}
return;
}
гарантирует, что оба указателя a и b обеспечивают доступ к первому элементу массива, содержащего не менее десяти элементов. Ключевое слово static также гарантирует, что указатель не равен NULL и указывает на объект соответствующего действующего типа.
Обоснование, похоже, предлагает более строгие гарантии, чем те, которые указаны в стандарте C. *
На основе этих фактов:
- Существуют ли какие-либо практические системы, в которых это дает «значительные преимущества», как указано в обосновании?
- Почему стандарт C делает нет таких гарантий (как в обосновании C99), которые могли бы мотивировать введение этой функции в первую очередь?
(Очевидно, что лучшую диагностику времени компиляции можно было бы использовать только один раз, но это не значит " значительное преимущество »и не помогает оптимизациям, как предполагалось. Кроме того, компиляторы всегда могут выполнить диагностику, если они обнаружат потенциальное разыменование нулевого указателя без такой формальной функции).