LINUX.ORG.RU

[Си] Какова мотивировка «‘‘array of type’’ shall be adjusted to ‘‘qualified pointer to type’’»?


0

0

SO/IEC 9899:1999

6.7.5.3 Function declarators (including prototypes)

абзац 7

A declaration of a parameter as ‘‘array of type’’ shall be adjusted to ‘‘qualified pointer to type’’, where the type qualifiers (if any) are those specified within the [ and ] of the array type derivation. If the keyword static also appears within the [ and ] of the array type derivation, then for each call to the function, the value of the corresponding actual argument shall provide access to the first element of an array with at least as many elements as specified by the size expression.

А смысл? Может тогда и все массивы сделать указателями на тип, а значит и modifiable lvalue? Почему это сделано только с массивами, являющимися параметрами функции?

Re: [Си] Какова мотивировка "‘‘array of type’’ shall be adjusted to ‘‘qualified pointer to type’’"?

Может херь сморожу, но может при передаче параметра по ссылке это надо? Не? fixme.

m1rag3 ★★ ()

Re: [Си] Какова мотивировка "‘‘array of type’’ shall be adjusted to ‘‘qualified pointer to type’’"?

>но может при передаче параметра по ссылке это надо

В "Си" нет передачи параметра по ссылке.

Demon37 ★★★★ ()

Re: [Си] Какова мотивировка "‘‘array of type’’ shall be adjusted to ‘‘qualified pointer to type’’"?

Честно говоря, так и не понял что не понравилось топикстартеру %)

Demon37 ★★★★ ()

Re: [Си] Какова мотивировка "‘‘array of type’’ shall be adjusted to ‘‘qualified pointer to type’’"?

не понравилось, что не ругается на третью строчку, но ругается на девятую:

anonymous@anonymous ~ $ cat tt.c | awk '{print NR, $0}'
1 void f(char x[2])
2 {
3       ++x;
4 }
5
6 int main()
7 {
8       char x[2];
9       ++x;
10      return 0;
11 }
anonymous@anonymous ~ $ cc tt.c -std=c99 -Wall -o tt
tt.c: In function ‘main’:
tt.c:9: error: invalid lvalue in increment
anonymous@anonymous ~ $

braked ()

Re: [Си] Какова мотивировка "‘‘array of type’’ shall be adjusted to ‘‘qualified pointer to type’’"?

Ну ясно. Мотивация, видимо, такая: передавать массив-аргумент по значению ресурсозатратно, а передачи по ссылке нет вообще. Единственный компромиссный вариант -- передавать указатель. Поэтому запись char * x и char x[] равноценна в данном случае.

Demon37 ★★★★ ()

Re: [Си] Какова мотивировка "‘‘array of type’’ shall be adjusted to ‘‘qualified pointer to type’’"?

Это все понятно. Не ясно зачем они делают его при этом изменяемым лвалуе. Я ожидал ругань на 3-ю строчку ровно такую же, как и на 9-ю.

braked ()

Re: [Си] Какова мотивировка "‘‘array of type’’ shall be adjusted to ‘‘qualified pointer to type’’"?

>Не ясно зачем они делают его при этом изменяемым лвалуе

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

Demon37 ★★★★ ()

Re: [Си] Какова мотивировка "‘‘array of type’’ shall be adjusted to ‘‘qualified pointer to type’’"?

Есть такое понятие как обратная совместимость. Думаю из-за неё сохранены такие конструкции (1. объявление параметра функции как массив или 2. возможность использовать его как лвалуе в теле функции).

Как я понял, в спецификации предлагают объявить параметр как указатель и не париться. Если тебя так смущает тот код, который ты выше привёл, перепеши код согласно рекомендации и всё, делов-то.

O_o ()

Re: [Си] Какова мотивировка "‘‘array of type’’ shall be adjusted to ‘‘qualified pointer to type’’"?

В этом случае можно объявить не void f(char a[]);, а void f(char *a).

А void f(char a[]); оставить тем, кто хочет, чтобы компилятор следил за тем, что массив не используется в качестве изменяемого l-значения.

braked ()

Re: [Си] Какова мотивировка "‘‘array of type’’ shall be adjusted to ‘‘qualified pointer to type’’"?

>Есть такое понятие как обратная совместимость. Думаю из-за неё сохранены такие конструкции (1. объявление параметра функции как массив или 2. возможность использовать его как лвалуе в теле функции).

Это работает и в c89, и в c99. Не знаю как там было во времена динозавров, у Кернигана-Ритчи нет упоминаний об этом факте. Да и не вижу я ничего анахроничного в массиве как параметре функции. Более того, мне странно видеть size_t strlen(const char *s);, вместо size_t strlen(const char s[]); (гипотетически странно видеть; если бы массив-параметр так и оставался бы массивом).

Возможность использовать массив как лвалуе никто не хочет отобрать, можно объявить параметр как указатель, а не массив.

>Как я понял, в спецификации предлагают объявить параметр как указатель и не париться. Если тебя так смущает тот код, который ты выше привёл, перепеши код согласно рекомендации и всё, делов-то.

Спецификация говорит, что массив интерпретируется как указатель на тип элемента массива. Код меня не смущает, мне не понятна мотивация такого положения стандарта.

braked ()

Re: [Си] Какова мотивировка "‘‘array of type’’ shall be adjusted to ‘‘qualified pointer to type’’"?

Да что-то я посмотрел на "программирование и разработка ПО под Linux/Unix" и решил, что к линуксу/юниксу это не имеет отношения :).

braked ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.