Почему я должен объявлять размер параметра массива C в заголовке функции? - PullRequest
14 голосов
/ 04 марта 2011

Может ли кто-нибудь объяснить мне, почему я должен указывать размер аргумента массива C в заголовке функции?Например:

void foo (int iz[6]) { iz[42] = 43; }

С:

int is[2] = {1,2,3};

мы получаем полезную ошибку.Возможно, это поможет с комментированием / документацией?

Ответы [ 4 ]

13 голосов
/ 04 марта 2011

Может ли кто-нибудь объяснить мне, почему я должен указывать размер аргумента массива C в заголовке функции? Например:

void foo (const char sz [6]) {sz [42] = 43; }

ИМО, ты не должен. Когда вы пытаетесь передать массив в функцию, на самом деле передается указатель на начало массива. Поскольку то, что получает функция, будет указателем, лучше написать это, чтобы сделать это явным:

void foo(char const *sz)

Тогда, поскольку теперь ясно, что функция не имеет понятия о размере, добавьте это как отдельный параметр:

void foo(char const *sz, size_t size)
10 голосов
/ 16 октября 2014

Единственная значимая причина сделать это для целей документирования - сообщить будущим пользователям, что функции ожидают получить массив, по крайней мере, такого количества элементов.Но даже это условно - то, о чем вы должны заранее договориться с другими пользователями.Язык (компилятор) в любом случае игнорирует этот размер.Объявление вашей функции эквивалентно void foo(int iz[]) и void foo(int *iz).

. Единственный способ сделать его несколько значимым для компилятора - объявить его как

void foo (int iz[static 6])

, который действует какпообещать компилятору, что массив будет содержать не менее 6 элементов, а это означает, что компилятор сможет оптимизировать этот код, используя это предположение.Более того, если вы действительно хотите принять соглашение, упомянутое выше, имеет смысл объявить размеры параметров массива конкретно с static, поскольку язык явно определяет семантику этой конструкции.

Что вы подразумеваете под "мы получаем полезную ошибку "мне не понятно.Код

int is[2] = {1,2,3};
is[42] = 42;

не содержит каких-либо нарушений ограничений.Это приводит к неопределенному поведению, но не требуется создавать диагностическое сообщение во время компиляции.Другими словами, нет, мы не получаем никакой «полезной ошибки» из этого.

7 голосов
/ 04 марта 2011

Это комментарий.Массивы понижены до указателей в параметрах функции.Однако комментарии могут быть полезны, даже если компилятор их не читает.

0 голосов
/ 16 октября 2014

Это полезный комментарий, когда вы хотите сообщить клиентскому коду, что он должен передать массив определенного размера , то есть:

void foo(const char bar[5]);
/* It is expected that foo function receives an array of size 5 */

Тем не менее, документация не заменяетв проверках кода:

void foo(const char bar[5])
{
    if (!bar) error();
    if (strlen(bar) != 4) error();
    /* ... */
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...