- 1
enum {size = 10, timeout = 50};
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+142
enum {size = 10, timeout = 50};
AxisPod 30.06.2010 11:05 # 0
xaionaro 30.06.2010 11:14 # +5
В том смысле, что похоже, что timeout - это кол-во секунд соотвествующие timout-у в какой-то операции, а size - это размер какого-нибудь буфера.
vovochka 30.06.2010 11:21 # +3
0x457845 30.06.2010 11:27 # 0
cfdev 30.06.2010 13:42 # +4
pushkoff 30.06.2010 13:59 # −3
поэтому константы в enum самые православные...
в новом стандарте обещали типизированный enum...
Говногость 30.06.2010 20:29 # 0
gpr 30.06.2010 14:25 # −2
pushkoff 30.06.2010 23:07 # +2
pushkoff 30.06.2010 23:09 # −4
nil 01.07.2010 08:59 # +4
pushkoff 30.06.2010 12:46 # −4
эти константы 100% компайл тайм...
к стати они допускают компайл тайм вычисления (если это возможно), допустим так
ну и те кто поопытней, знают что такой код:
cfdev 30.06.2010 13:40 # +6
> не говнокод 100%. у нас в кодгайдлайне такой метод рекомендован...
Говногайдлайны уж постить нельзя?
pushkoff 30.06.2010 14:02 # −2
оптимизация такого дефайна
#define kAlignedSize(kSize) (kSize + 15) & (~0xF)
ляжет на плечи компилятора, и если оптимизации отключены или компилятор не понял идей аффтара, то вычисление переедет в рантайм...
в енаме компилятор гарантирует компайл тайм иначе будет ошибка...
cfdev 30.06.2010 14:50 # +3
В любом случае, это что касается "составных" дефайнов. В приведённом же примере имеем тупо числа, они 100% в любом самом засраном компиляторе будут компайл-тайм, т.е. конкретно приведённый пример есть говнокод, за остальное я не говорю.
pushkoff 30.06.2010 16:56 # −3
cfdev 30.06.2010 17:13 # 0
s = ZHOPA;
после работы препроцессора выглядеть в коде будет так (если CONST1 == 1):
s = (1 + 1);
Теоретически гарантий может и нету, но практически они есть в любом адекватном компиляторе. Или ты считаешь, что компилятор будет тупо делать push 1; push 1; add?!
> поведение в дебаге и релизе будет совсем разным...
С чего бы? Объект константен вне зависимости от того, инициализируется он в рантайме или в компайлтайме. Ты не тяни сюда свой с++, мы не может сделать константный объект, который бы в своём конструкторе мог делать сайд-эффект на окружение. Да и в сиплюсе юзание сайд-эффектов при конструкции константного объекта было бы говнокодом. Поведение будет одно и то же. Или ты путаешь поведение с реализацией поведения?
TarasB 30.06.2010 18:05 # +2
Ага, call add. Сложение путём вызова подпрограммы.
pushkoff 30.06.2010 18:20 # −3
если не понимаешь профита от компайл тайм вычислений так и скажи, не надо пытаться убеждать окружающих, что кактус вкусный и в сыром виде...
Говногость 30.06.2010 20:37 # +2
А по делу:
Компилитайм вычисления редко нужны. А там где нужны - экономия на спичках. И вообще, всё что можно посчитать во время компилитайма - можно посчитать и в другое время один раз. Например при старте приложения или в момент ипользования(линивые вычисления).
pushkoff 30.06.2010 21:46 # −4
enum
const int
define
Говногость 30.06.2010 23:11 # +2
pushkoff 01.07.2010 00:00 # −3
P.S. я против удаления define из С++, так как есть места где без него плохо, допустим в ASSERT...
cfdev 01.07.2010 10:46 # +2
kaktus 07.05.2015 22:24 # 0
Не надо меня готовить! Есть растения, более лёгкие в приготовлении.
cfdev 01.07.2010 10:40 # +3
Мне таких хаков задаром не надо... Внимательней будь и всё.
Один хуй после стряпания кода будешь юзать профайлер (или вы в вашей говноконторе их не юзаете?) и найти такое проблемное место будет довольно несложно (если оно действительно проблемное, а не тупое "premature optimization" в ущерб чистоте кода).
pushkoff 01.07.2010 12:51 # 0
код должен говорить программисту о его ошибках!
cfdev 01.07.2010 13:11 # +3
Не тот язык выбрал, значит. Си именно что славится своей нестрогостью. И попытки сделать его строгим всегда останутся хитровыебанными хаками.
cfdev 01.07.2010 13:14 # 0
И-таки почитай про premature optimizations, опытный ты наш.
pushkoff 01.07.2010 13:59 # 0
и она неприменима в 90% случаев в которой ее пытаются применить, так как эту цитату чаще применяют как отмазку своей неопытности, как в примере с тобой...
TarasB 01.07.2010 18:12 # −1
xXx_totalwar 01.07.2010 18:25 # +2
"преждевременная оптимизация - залог здорового говнокода"
=)
pushkoff 01.07.2010 21:48 # 0
неоптимизированный код тоже может быть говнокодом...
cfdev 01.07.2010 23:56 # +3
> свертывание констант в компайл тайме это не оптимизация
Да в полне оптимизация.
Логически (если рассматривать как blackbox) программа будет получать одно и то же значение - по этому верно будет сказать, что значение - константно.
А вот как это значение в ассемблере реализуется - это уже детали реализации. То что ты предлагаешь - это хитровыебанные хаки, чтобы заставить компилятор генерировать нужный тебе ассемблер-код. Это, конечно, полезная идея, однако 99% кода особо остро не нуждается в компайл-тайм свёртке и в 99% случаев (исхожу из практики) комплиятор уже всё сам сворачивает в компайл-тайме. Исходя из этого можно сказать, что сий хак не стоит выеденного яйца (по крайней мере, чтобы пихать его всюду).
pushkoff 02.07.2010 00:06 # −3
cfdev 02.07.2010 00:22 # +1
pushkoff 02.07.2010 12:36 # −2
cfdev 02.07.2010 13:32 # 0
cfdev 02.07.2010 00:30 # +1
С юнит-тестами и валгриндами, я знаю, что мои программы правильные. Не всё же дебажить с помощью printf'ов...
pushkoff 02.07.2010 12:38 # −2
cfdev 02.07.2010 13:34 # +1
gpr 02.07.2010 09:24 # −3
int i = 0;
int zhopa = DOUBLE_ZHOPA(i++);
дефайны - в жопу!
cfdev 02.07.2010 09:47 # 0
pushkoff 02.07.2010 12:30 # −1
cfdev 02.07.2010 13:34 # 0
pushkoff 03.07.2010 04:29 # −1
cfdev 03.07.2010 05:24 # 0
pushkoff 03.07.2010 15:23 # +1
xXx_totalwar 03.07.2010 07:12 # 0
literate programming?
что-то я не видел, чтоб его крестофилы использовали
pushkoff 03.07.2010 15:36 # +1
я про то, если есть возможность написать код который не будет доставлять в будущем, то лучше это сделать...
define практически всегда невыдерживает рефакторинга, об ограничениях const я написал. я понимаю что это все в С++, но никто не мешает использовать это в С...
inkanus-gray 02.07.2010 10:59 # 0
http://www.parashift.com/c++-faq-lite/misc-technical-issues.html
http://www.parashift.com/c++-faq-lite/inline-functions.html
И применение инкрементов в правой части тоже:
http://govnokod.ru/3535
http://lurkmore.ru/++i_+_++i
Макросы-константы вполне безобидны.
pushkoff 02.07.2010 12:34 # 0
cfdev 30.06.2010 17:42 # +1
asm:
Gcc o3:
Уже сразу херачит 32... То же самое, если подставить, допустим, sizeof(int) - сразу оперирует с числом 16.
nil 30.06.2010 22:38 # +1
Но енумы все-таки лучше, они типизированы, разные вкусные штучки на уровне компилирования, например, если в свиче не все значения.
И их видно в дебугере!
Сделали б еще определение количества элементов, цены б ему не было, а то извращаться приходится.
cfdev 01.07.2010 10:30 # +2
nil 01.07.2010 10:56 # +1
vovochka 01.07.2010 11:05 # +1
но в таком случае - никогда.
ну и уж тем более нельзя загонять под один енум.
pushkoff 01.07.2010 12:56 # −4
cfdev 01.07.2010 13:02 # +2
pushkoff 01.07.2010 13:46 # −2
cfdev 01.07.2010 23:50 # +1
vovochka 01.07.2010 13:08 # +4
Иногда const int удобнее, не спорю.
Енум - легкое извращение.
А упор был на то, что в один енум запхнуть - это просто идиотизм.
Проще тогда вообще все константы модуля в один енум закинуть.
pushkoff 01.07.2010 13:47 # −3
vovochka 01.07.2010 14:13 # +1
Идея-то в чем? изменить одно значение по необходимости в одном месте с минимальным усилием.
К тому же, если уж так смотреть на удобство дальнейшего использования, то дефайн позволяет потом сделать что-то вроде
#define timeout (getTimeout())
pushkoff 01.07.2010 14:31 # −4
если ему нужна константа он создает константу, если ему нужна подстановка он использует дефайн...
к счастью, этот сайт всегда рад тем кто не понимает этого простого правила...
Говногость 01.07.2010 14:34 # +1
Почему к сожалению? О_о
pushkoff 01.07.2010 15:52 # −7
большая часть темы, это:
- компилятор сделает все за меня
- зачем напрягать свой моск
- я уверен в том что этот говнокод рабочий
- ...
- premature optimisation
И при этом эти люди считают себя довольно крутыми программистами...
xXx_totalwar 01.07.2010 16:08 # +4
pushkoff 01.07.2010 17:06 # −4
xXx_totalwar 01.07.2010 17:11 # +5
pushkoff 01.07.2010 15:55 # −3
xXx_totalwar 01.07.2010 16:09 # +2
pushkoff 01.07.2010 17:06 # −2
vovochka 01.07.2010 15:23 # +5
pushkoff 01.07.2010 15:53 # −3
vovochka 01.07.2010 18:38 # +4
pushkoff 01.07.2010 21:47 # −4
cfdev 01.07.2010 23:52 # −2
для с++, но не для с.
pushkoff 02.07.2010 00:08 # −2
cfdev 02.07.2010 00:11 # −2
TarasB 30.06.2010 17:51 # +5
? 1 : 0;
[/quote]
Смотрите, смотрите, Пушков бульшитит!
Говногость 30.06.2010 20:40 # +2
pushkoff 30.06.2010 21:48 # −5
Говногость 30.06.2010 23:16 # +1
>результат сравнения имеет тип bool, тернарный оператор для енамов считается в компайл тайме, если все его аргументы - константа...
Капитан Очевидность?
>единственная проблема в том куске кода это ;...
сам кусок кода :D
pushkoff 01.07.2010 00:04 # −1
Говногость 01.07.2010 00:22 # 0
TarasB 01.07.2010 18:33 # −3
(int)(a>b)
pushkoff 01.07.2010 21:46 # −1
cfdev 02.07.2010 00:12 # 0
absolut 02.07.2010 00:30 # 0
cfdev 02.07.2010 00:41 # 0
absolut 02.07.2010 07:40 # −2
vovochka 02.07.2010 11:29 # 0
absolut 02.07.2010 20:04 # 0
Вообще, уже пора С/С++ разделы объединить.
Но тогда куча троллей останется без дела.
vovochka 02.07.2010 20:48 # 0
absolut 02.07.2010 20:52 # −1
vovochka 02.07.2010 23:11 # 0
absolut 03.07.2010 00:53 # −1
vovochka 03.07.2010 11:12 # 0
absolut 03.07.2010 11:15 # 0
pushkoff 02.07.2010 12:32 # −2
cfdev 02.07.2010 13:37 # 0
absolut 03.07.2010 01:01 # +3
pushkoff 03.07.2010 04:30 # −2
absolut 03.07.2010 08:04 # 0
Для явного преобразования я вижу такие применения:
(актуально в Си, где еще не добавили bool)
onoff - массив типа, ведущего себя как bool ( т.е. 0 - ложь, всё остальное - истина )
mask - по сути битовая маска, которую потом в явном виде скармливаешь какой-нибудь многоканальной железке ввода/вывода.
Или например так:
P.S. А вот в С++ bool'ы по стандарту преобразуются в 0/1, и такие пляски уже ни к чему.
4.7.4 If the source type is bool, the value false is converted to zero and the value true is converted to one.
pushkoff 03.07.2010 15:46 # 0
vovochka 01.07.2010 06:39 # +6
И я не говорю, что такой код неправилен в плане того, что создает какие-то ошибки. Он неправилен со стилистической точки зрения. Если уж надо использовать перечисление - то прямая дорога к двум различным енумам с одним определением.
код на самом деле выглядит еще немного ужасней, примерно так:
Что кагбе намекает на то, что PREFIX_SIZE - он той же единицы измерения, что и PREFIX_TIMEOUT.
gpr 01.07.2010 08:18 # −4
основные претензии говнокодеров в том, что это енум, а не дефайн
Говногость 01.07.2010 09:22 # +3
Нет. Я тоже считаю, что нужно разносить логически не связанные константы по разным энумам.
Или ты меня считаешь не говнокодером? Обижаешь... Я настоящий говнокодер и иду по непревзойдённому говнокодному пути.
vovochka 01.07.2010 09:29 # +5
timeout - промежуток времени, часами мерить надо
size - размер, в килограммах/байтах/сантиметрах и т.д.
по названию по-моему, явно видно.
gpr 01.07.2010 11:16 # −3
вот пример на C
enum {
size = 10,
timeout = 20
};
char buf[size];
...
read_data_with_timeout(&buf, size, timeout);
константы логически связаны
cfdev 01.07.2010 11:19 # +1
Вот это я ещё понимаю:
gpr 01.07.2010 11:41 # 0
У дефайна нет scope, да и вообще это препроцессор и к языку никак не относится
cfdev 01.07.2010 11:49 # 0
А он, scope, зачем-то нужен?
> да и вообще это препроцессор и к языку никак не относится
Welcome to C.
> и при этом ты следишь за всеми файлами в проекте, не дай бог где-нибудь случайно появится еще один SIZE, не связанный с этим SIZE?
Это я для примера так написал. Сам-то я использую систему префиксов:
1) два символа, идентифицирующие проект
2) имя логического неймспейса
3) непосредственно значение
Напр.: CF_BUFFER_DEFSIZE
Легко, просто, вкусно.
xaionaro 25.08.2010 19:10 # 0
Во-первых лично у меня имена так систематизированы, что пересечение крайне маловероятно. Во-вторых даже если будет пересечение, то компилятор ругнётся о переобъявлении.
nil 02.07.2010 00:29 # 0
Это как январь|февраль, НЕХ какая-то.
Но, может, это образование сказывается, кольца там, поля всякие. Воротит от непонятных, левых операций:)
Поэтому у меня все битовые флаги — это не енумы.
Но, наверное, это тараканы, никакой почвы под лапами не имеющие.
xaionaro 25.08.2010 19:14 # 0
vovochka 01.07.2010 11:22 # +4
размер и таймаут - это величины разного порядка, а следовательно, в одном енуме они выглядят говёно.
gpr 01.07.2010 11:44 # 0
vovochka 01.07.2010 12:52 # +1
gpr 30.06.2010 14:00 # −4
Вполне нормальный код.
del 30.06.2010 16:32 # +1
pushkoff 30.06.2010 16:58 # −4
inkanus-gray 30.06.2010 18:29 # +3
Всё-таки перечисление — это набор однотипных сущностей, а здесь время и количество. Но данный код только выглядит ужасно, а работать он должен. Хотя написать #define было бы нагляднее, чем плодить новые сущности.
pushkoff 30.06.2010 18:33 # 0
Говногость 30.06.2010 20:46 # +2
Да. Пожалуй никто не погибнет. Лишь при прилунении лунохода, последний разлетится на мелкие кусочки из-за того, что тип энумв и другой переменной случайно совпали и ошибки компиляции не последовало.
Знаешь, сколько людей за эти деньги можно было вылечить от рака и спасти им жизнь?
pushkoff 30.06.2010 21:51 # −4
Говногость 30.06.2010 20:52 # +1
cfdev 01.07.2010 10:36 # +2
Но раздел-то "си". Запостил бы автор сие в С++ - нареканий бы не было. Какими бы хаками с++-дитя не тешилось...
pushkoff 01.07.2010 12:54 # −3
"где здесь С++?"
xXx_totalwar 01.07.2010 16:27 # +3
и не стыдно? =)
3.14159265 01.07.2010 16:43 # +3
http://govnokod.ru/3508
cfdev 02.07.2010 08:36 # 0
pushkoff 02.07.2010 12:31 # −3
vovochka 02.07.2010 14:31 # +1
непотребное ООП компилятор не поддерживает.
pushkoff 01.07.2010 17:11 # −1
xXx_totalwar 01.07.2010 17:16 # +3
inkanus-gray 01.07.2010 17:16 # +4
Так зондеркоманда в Интернете всё-таки существует! А что нам за плюсы и минусы будет? Как в поисковике: мы вопрос, а Вы ссылку?
xXx_totalwar 01.07.2010 17:19 # +2
pushkoff 01.07.2010 17:42 # −2
cfdev 03.07.2010 17:01 # 0
guest 23.03.2012 18:16 # 0