Здравствуйте, Сыроежка, Вы писали:
С>Нельяз объявлять массив со значением размера равным 0.
С>If the constant-expression (5.19) is present, С>it shall be an integral constant expression and its value shall be greater than zero.
Это я цитировал С++ стандарт, а в С99 стандарте написано то же самое: "If the expression is a constant expression, it shall have a value greater than zero."
gcc version 4.3.2 (Debian 4.3.2-1.1) скомпилил без проблем.
Только Путин, и никого кроме Путина! О Великий и Могучий Путин — царь на веки веков, навсегда!
Смотрю только Соловьева и Михеева, для меня это самые авторитетные эксперты.
КРЫМ НАШ! СКОРО И ВСЯ УКРАИНА БУДЕТ НАШЕЙ!
На каком основании сделано такое утверждение? Стандарт, опыт общения с ужасно написанным кодом (хотя, кому в голову придёт объявить массив нулевого размера, я не знаю) или что-то ещё?
С>Это я цитировал С++ стандарт, а в С99 стандарте написано то же самое: "If the expression is a constant expression, it shall have a value greater than zero."
Здравствуйте, PlusMyTwitterFace, Вы писали:
S>>gcc version 4.3.2 (Debian 4.3.2-1.1) скомпилил без проблем в режиме С и С++.
PMT>Я о том же. Вопрос заключается в валидности такого приёма.
Только Путин, и никого кроме Путина! О Великий и Могучий Путин — царь на веки веков, навсегда!
Смотрю только Соловьева и Михеева, для меня это самые авторитетные эксперты.
КРЫМ НАШ! СКОРО И ВСЯ УКРАИНА БУДЕТ НАШЕЙ!
Здравствуйте, PlusMyTwitterFace, Вы писали:
С>>Это я цитировал С++ стандарт, а в С99 стандарте написано то же самое: "If the expression is a constant expression, it shall have a value greater than zero."
PMT>Т.е., получается, баг компилятора?
Если рассматривать ваш пример
int main()
{ int arr[0];
}
то из мною процитированного следует, что это баг по крайней мере согдасно стандарту С99. Нужно было бы еще заглянуть в новый стандарт С от 2011 года.
Честно говоря, не понял смысла в выделенном вами слове.
То, что приведённый выше код прекрасно компилируется при помощи gcc, я написал ещё в первом сообщении (правда, версия была поновее). Под "валидностью" в данном случае подразумевалось соответствие такого приёма стандартам языков C / C++.
Я вот как-то Comeau в плане соответствия стандарту больше доверяю, поэтому мнение gcc на этот счёт я учитываю немного меньше.
Здравствуйте, PlusMyTwitterFace, Вы писали:
С>>Нужно было бы еще заглянуть в новый стандарт С от 2011 года.
PMT>Мне кажется, лучше уж посмотреть C89 / C90.
Могу вам предоставить интересуню ссылку, где обсуждается вопрос, имеющий также отношению к нулевому размеру массива.
Здравствуйте, PlusMyTwitterFace, Вы писали:
PMT>Чисто ради интереса — разрешает ли стандарт языка C использовать массивы нулевой размерности?
Нет.
PMT>Баг компилятора?
Нет.
Это фича.
Здравствуйте, PlusMyTwitterFace, Вы писали:
PMT>стандарт языка C
PMT>а вот gcc в режиме C считает, что всё валидно
А как вы компилируете с помощью gcc?
У меня все версии gcc выдают ошибку:
$ gcc -c test.c -std=c99 -pedantic -Werror
test.c:3:9: error: ISO C forbids zero-size array 'arr'
Может просто забыли указать, что нужно следовать стандарту языка C?
PMT>Баг компилятора?
Если включены нестандартные расширения, то такие массивы допускаются (они были нужны пока в С99 не появились flexible array member). Если расширения не включены, а задано следование стандарту, то такой код не компилируется.
gcc использовал в данном случае лишь на сайте liveworkspace.org
WM>Если включены нестандартные расширения, то такие массивы допускаются (они были нужны пока в С99 не появились flexible array member). Если расширения не включены, а задано следование стандарту, то такой код не компилируется.
С практической точки зрения: "А ни все ли равно"?
Лично я массивы воспринимаю как указатели, которые "компилятор неявно аллоцировал", естественно помня о том, где они "аллоцированы" и о небезграничности стека.
А в остальном, что указатель, что массив — в языке C (не C++) — один хрен, кроме sizeof, но я о нем помню.
И да, malloc(0) тоже не особо определен, по крайней мере в стандарте C-99
__________
16.There is no cause so right that one cannot find a fool following it.
MZ>Слушайте, я что-то всё путаю сегодня.
MZ>Массив нулевого размера не может быть. MZ>Структура может быть "нулевого размера", но она на самом деле не будет физически MZ>0-го размера.
Стандартный контейнер std::array эммулирует массивы с нулевым количеством элементов.
Здравствуйте, PlusMyTwitterFace, Вы писали:
PMT>Или ошибки не было даже в режиме C++?
Да, ни в С ни в С++ небыло ошибок.
Только Путин, и никого кроме Путина! О Великий и Могучий Путин — царь на веки веков, навсегда!
Смотрю только Соловьева и Михеева, для меня это самые авторитетные эксперты.
КРЫМ НАШ! СКОРО И ВСЯ УКРАИНА БУДЕТ НАШЕЙ!
Здравствуйте, PlusMyTwitterFace, Вы писали:
PMT>На каком основании сделано такое утверждение? Стандарт, опыт общения с ужасно написанным кодом (хотя, кому в голову придёт объявить массив нулевого размера, я не знаю) или что-то ещё?
Массив нулевого размера идеоматически используется как последнее поле структуры переменного размера:
Здравствуйте, wander, Вы писали:
W>Здравствуйте, PlusMyTwitterFace, Вы писали:
PMT>>Чисто ради интереса — разрешает ли стандарт языка C использовать массивы нулевой размерности? W>Нет.
PMT>>Баг компилятора? W>Нет. W>Это фича.
Более того, это имба-фича, на которой многое держится.
Здравствуйте, PlusMyTwitterFace, Вы писали:
Pzz>>Массив нулевого размера идеоматически используется как последнее поле структуры переменного размера
PMT>Честно говоря, не совсем понимаю, зачем такое может понадобиться на практике.
ДД>В языке C структура может быть нулевого размера, и на самом деле она физически будет нулевого размера.
Как это представить с точки зрения языка? Ведь причина, по которой в C++ не бывает структуры / класса нулевого размера (за одним-единственным исключением), насколько мне известно, связана с тем, что у каждого объекта должен быть уник. адрес.
Здравствуйте, PlusMyTwitterFace, Вы писали:
PMT>Как это представить с точки зрения языка? Ведь причина, по которой в C++ не бывает структуры / класса нулевого размера (за одним-единственным исключением), насколько мне известно, связана с тем, что у каждого объекта должен быть уник. адрес.
Так это в C++ должен быть, а в C не обязательно.
Обязательно бахнем! И не раз. Весь мир в труху! Но потом. (ДМБ)
Здравствуйте, watch-maker, Вы писали: WM>У меня все версии gcc выдают ошибку: WM>
$ gcc -c test.c -std=c99 -pedantic -Werror
WM>test.c:3:9: error: ISO C forbids zero-size array 'arr'
WM>
скажите, какой на какой версии компилятора проверяли?
дело в том, что на LWS используется 4.7.0, и после того как я добавил для Си режима ключик '-pedantic' — ничего не изменилось.
вот ключи используемые для Си режима: -Wall -W -std=c99 -pedantic
спасибо.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)