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? Почему это сделано только с массивами, являющимися параметрами функции?


Ответ на: комментарий от Demon37

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

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
() автор топика
Ответ на: комментарий от braked

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

Demon37 ★★★★
()
Ответ на: комментарий от Demon37

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

braked
() автор топика
Ответ на: комментарий от braked

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

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

Demon37 ★★★★
()
Ответ на: комментарий от braked

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

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

O_o
()
Ответ на: комментарий от Demon37

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

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

braked
() автор топика
Ответ на: комментарий от O_o

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

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

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

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

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

braked
() автор топика
Ответ на: комментарий от O_o

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

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