- 1
- 2
- 3
- 4
- 5
- 6
struct Foo {
};
struct Bar {
int x[0];
};
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+4
struct Foo {
};
struct Bar {
int x[0];
};
https://ideone.com/upuoOg
Какая консистентность )))
а пустой эррей это небось вообще какое-нить убе, и компилятор его выпилил?
[ <size>, <element 1>, <element 2> ... ]
Зачем блядь, говно-то? Ну почему опять говно? Почему, блядь, говно-то? Почему, бляди, зачем говно-то, а? Ну как так-то, а?
6.2.5 Types
20 An array type describes a contiguously allocated nonempty set of objects with a particular member object type, called the element type.
Это gcc'изм:
6.18 Arrays of Length Zero
Declaring zero-length arrays is allowed in GNU C as an extension.
Так что тут у нас UB равно по размеру UB
Охуенно...
Ну кроме /s/%d/%lu/g
Кстати, а эта хуйня делает хоть что-то полезное помимо ругательства на // крестовые комменты?
В доке вообще написано, что оно просто убирает несколько кейвордов (asm, typeof) чтобы проги написанные согласно стандарту могли собраться не спотыкаясь об расширения.
>проги написанные согласно стандарту могли собраться
Я эту херь добавил чтобы она отловила гццизм с int x[0].
Поэтому его ловит только педантик.
То есть толк есть.
Не особо. Педантик эту хуйню и так ловит если у тебя стандарт ниже С99. А анси, судя по доке, одним из сайд-эффектов за каким-то хером врубает С90 (из-за restrict поди?).
..чем делает твой код переносимым на все существующие в мире компиляторы
годно же?
Неа. Дух опции -ansi заключается в том, чтобы древнее говнище, юзающее restrict, asm и typeof в качестве переменных начало собираться. Всё. На этом годнота заканчивается.
-ansi без -pedantic не будет ругаться на гццизмы и они проберутся в твой код.
Иными словами:
-ansi: я хочу собрать вот это говно, которое у меня работало лет 30 назад
-pedantic: я хочу, чтобы моё говно собиралось любым компилером, который умеет соотв. стандарт
Ну, граница между C90 и C99 на это намекает. Оно ещё триграфы включает, кстати.
В «Borland C» ещё наверняка много чего не поддерживается. Возможно, ещё в «LCC» всё плохо.
На удивление в «Pelles C», «TCC», «Open Watcom», «IBM Visual Age», «Digital Mars» поддержку «C99» завезли.
Бывший LCC (пришлось погуглить)
> TCC
Фабрис Беллард
> Open Watcom
> Digital Mars
Известное старьё.
«Open Watcom» — свободное продолжение коммерческого «Watcom C». Сейчас развивается слабо.
https://bellard.org/jslinux/
Вот тут предыстория:
https://bellard.org/jslinux/tech.html
> https://govnokod.ru/23821#comment402754
> https://govnokod.ru/15663#comment225475
У него на сайте много всяких чудес.
QEMU, FFmpeg, tcc выросли в отдельные проекты.
https://bellard.org/textsynth/
Я переводчиком получал разные иероглифы, а потом разжимал из них всякую питушню.
Edit: вот тред https://govnokod.ru/19675#comment558492
Там вроде C89 был, а был ли там стандрат С++ я не помню. Скорее всего это были достандартные времена, хотя какие-то зайчатки Степанова там были.
Есть такая книжка "Редкая профессия" человека по фамилии Зуев
Там описывается, как питухи в весёлые 90-е пилили компилятор С++.
В ней очень много смешных багров, рекомендую ))
Если отбросить препроцессор, в сишке не было специальной обработки переноса строки. Это обычный пробел.
Вроде внутри блока asm в некоторых реализациях переносы строк учитываются, но он вообще вне стандарта и в каждом компиляторе реализован по-своему.
И у Борманда тоже
Только другое
Пустой array это UB в С и С++, но не в GCC
(Ага, знаю, сейчас налетят питухи и скажут кококо)
C обратно совместим с C++. Другими словами - подмножество языка. Программа, написанная на C будет компилироваться компилятором C++ и работать.
Какое-то (большое) подмножество программ действительно собирается и там и там. Но даже банальные class или virtual в качестве переменных всё ломают.
Неужели ты не в курсе?
> Одну текущую задачу сначала показали «плюсовику», спросив, сколько займёт её решение. Он сказал: «Здесь нужно писать могучий движок. Короче говоря, это проект на полгода». Его коллега-«сишник» поинтересовался: «А зачем?» Ведь поставленная задача укладывается в сотню строк кода! Ответ был ошеломляющим: «Ну и что, мы так и будем по сотне строк кода писать для решения частных задач, каждый раз, как они возникают? Нетушки, задачи надо решать раз и навсегда!».
> По моему глубокому личному убеждению, проблемы нужно решать по мере их возникновения. Писать программы на вырост с избыточным универсализмом нужно лишь очень хорошо предварительно подумав, ибо это из серии «Почему сегодня не делают корабли, летающие к звёздам?» Ответ прост: потому что корабль, построенный завтра, прибудет быстрее, а корабль, построенный послезавтра, еще быстрее. И их обоих обгонит корабль, построенный лет через пятьдесят, но когда он вернётся обратно, то обнаружит, что у человечества совсем другие проблемы».
Сишники юзали эту философию когда она ещё не была мейнстримом.
>> Нетушки
Программисты .NET
Хорошо это или плохо — вопрос другой. Крис как битолюб считает, что преждевременное обобщение — это плохо.
это же не вджаве примитив на генерик заменить
Кстати, в «C11» тоже есть «бесплатное обобщение»:
https://en.cppreference.com/w/c/language/generic
Но поскольку оно появилось поздно, традицией сишников оно не стало.
от инвоквирчуал ни файнал, ни прайват не спасают
int x[1];
} Bar;
вроде так нада.. не?
Какой багор )))
https://twitter.com/Semenov/status/1430993298072686603
Имення поэтому я за "C++".
Твой линк указывает на коммент, а в нем еще один линк, а в нем еще один.. я блядь пол часа убил
Переходишь по ссылке на страницу /1 , а там ссылка на /1/1 .
Переходишь по ссылке на страницу /1/1 , а там ссылка на /1/1/1 .
Переходишь по ссылке на страницу /1/1/1 , а там ссылка на /1/1/1/1 .
Переходишь по ссылке на страницу /1/1/1/1 , а там ссылка на /1/1/1/1/1 .
Переходишь по ссылке на страницу /1/1/1/1/1 , а там ссылка на /1/1/1/1/1/1 .
Переходишь по ссылке на страницу /1/1/1/1/1/1 , а там ссылка на /1/1/1/1/1/1/1 .
Переходишь по ссылке на страницу /1/1/1/1/1/1/1 , а там ссылка на /1/1/1/1/1/1/1/1 .
Переходишь по ссылке на страницу /1/1/1/1/1/1/1/1/1 , а там ссылка на /1/1/1/1/1/1/1/1/1/1 .
Переходишь по ссылке на страницу /1/1/1/1/1/1/1/1/1/1 , а там ссылка на /1/1/1/1/1/1/1/1/1/1/1 .
Раскрываешь ссылки только когда они реально понадобятся?