Первый -- нет, static_assert ничем не хуже. Только у нас static_saaert без текстового сообщения.
Кроме того у тебя в макросе предполагается, что CHAR_BIT равно 8, что не обязательно.
Второй -- нет. Во-первых, есть такая стандартная функция. Во-вторых, он вводит в заблуждение. Если внутри цикла cont.end() поменяется, то всё гавкнется. Кроме того если вызвать что-то типа foreach( i, *++vectors ), то будет а-та-та...
Для третьего в нашей библиотеке уже есть похожий макрос, ну и вообще он обычно уже есть => не надо вводить свой, надо юзать стандартный.
Так что нет все три раза.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
?..
fk0> Костыли и подпорки! Попытка через ()() сделать то, что в других языках делается просто и непосредственно!
Через какое такое ()()? Просто метод Process зовёшь и радуешься!
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, CaptainFlint, Вы писали:
CF>/нервно оглядываюсь, ища куда бы заныкаться от неотвратимого гнева гуру/
Я не гуру, но этот код в упор непроцедурный и такой же неэффективный...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, CaptainFlint, Вы писали:
CF>Просто потому что до прочтения той темы мне эта конструкция в Сях нигде не попадалась.
Ну это и обозначает её полную необщепринятость
А вообще вопрос неважный. Но лично я бы с очень большим подозрением относился к коду коллеги, кому такой приём нравится.
Ну просто я это воспринимаю, так, что если есть дубовое решение и есть трюк, то человек выбирает трюк. А я предпочёл бы дубовое, конечно. Так как оно стандартное.
Ну в целом, я думаю, можно уже расслабиться на тему...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Nik_1, Вы писали:
N_>Если они далеко не "в каждой строчке" будут использоваться, всеравно замаишься согласовывать. Я б такого начальника отдела с его заморочками послалбы куда подальше.
Организуешь свой бизнес -- пошлёшь
Но я тебе советую ориентироваться не на такие вещи, а на производительность и качество работы в отделе твоих будущих начальниуов отделов в твоём будущем бизнесе
E>>Соответсвенно, если у тебя эти сомнительные конструкции не используются то и согласовывать ничего не надо N_>Ну так скажи что такого плохо в макросах?
Ну это скучно. Обилием тркднодетектируемых ошибок не угодили.
Есть куча примеров описанных в литературе...
#drfine MAX( A, B ) ((A) > (B) ? (A) : (B))
char* q = "12";
int mx = MAX( *q++. *q++ );
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Nik_1, Вы писали:
E>>Что касается goto, то по нему нельзя обрулить создание объекта, доступного в точке, куда осуществляется переход... N_>Вот и говорю что не нужен , потому что слишком много всяких таких "но" и подводных камней в его использовании.
Каких таких камней? Тебе компилятор не даст сделать так:
goto afterA;
std::string A;
afterA: ;
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Nik_1, Вы писали:
N_>Вот ненадо тока переиначивать. Ты говорил что вообще макросы не разрешаешь, причем тут в каждой строчке
Тут сообщения вроде как не исчезают никуда в основном. Перечитай внимательно что я там говорил, и подумай, как из того, что я говорил, следует необходимость согласования каждой строчки...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
CF>>Просто потому что до прочтения той темы мне эта конструкция в Сях нигде не попадалась.
E>Ну это и обозначает её полную необщепринятость
Эм… Ну, скажем, я не настолько высокого о себе мнения, чтобы полагать, что знаю абсолютно все общепринятые конструкции и паттерны.
E>А вообще вопрос неважный. Но лично я бы с очень большим подозрением относился к коду коллеги, кому такой приём нравится. E>Ну просто я это воспринимаю, так, что если есть дубовое решение и есть трюк, то человек выбирает трюк. А я предпочёл бы дубовое, конечно. Так как оно стандартное.
E>Ну в целом, я думаю, можно уже расслабиться на тему...
Ну, я как-то особо и не напрягался.
Хоть во мнениях и не сошлись, но всё же лично мне было интересно и полезно узнать альтернативную точку зрения (да и вообще о слабых сторонах разных подходов). Надеюсь, взаимно.
Здравствуйте, dilmah, Вы писали:
D>Но я не понимаю о чем спор вообще? В С++ есть красивый способ кодирования: допустим тебе нужно написать мощную функцию/метод (которая делает что-то нетривиальное). Тогда внутри этой функции ты определяешь локальную структуру, которая будет "движком" этой функции, локальные переменные этой функции ты обычно затягиваешь внутрь этой структуры, чтобы методы структуры могли с ней работать. Ну и заодно десторуктор этой струткуры занимается освобождением ресурсов. В С такого стиля нет.
Говнокод. Костыли и подпорки. В GCC есть локальные функции.
CC>>пролезли бы?
E>Первый -- нет, static_assert ничем не хуже. Только у нас static_saaert без текстового сообщения.
Первый нужен чтоб быстро написать что то подобное:
E>Кроме того у тебя в макросе предполагается, что CHAR_BIT равно 8, что не обязательно.
Это мелочь. Можно заменить на константу.
Но блин покажите мне промышленную систему где это не так, и для которой С++ компилятор поддерживает static_assert.
E>Второй -- нет. Во-первых, есть такая стандартная функция.
Это которая std::for_each? Сие есть редкостное говно, ибо не позволяет писать в виде:
foreach (it, cont)
{
foo (*it);
}
E>Во-вторых, он вводит в заблуждение. Если внутри цикла cont.end() поменяется, то всё гавкнется.
Есть такой гипотетический минус, правда легко исправляемый:
#define foreach(it,cont) for (auto it = (cont).begin ();it != (cont).end ();++it)
Правда почему то за пяток лет активного использования на практике никто на это так и не напоролся.
Кстати std::for_each также подвержен этой "беде".
template<class _InIt, class _Fn1> inline _Fn1 for_each(_InIt _First, _InIt _Last, _Fn1 _Func)
{ // perform function for each element
_DEBUG_RANGE(_First, _Last);
_DEBUG_POINTER(_Func);
_CHECKED_BASE_TYPE(_InIt) _ChkFirst(_CHECKED_BASE(_First));
_CHECKED_BASE_TYPE(_InIt) _ChkLast(_CHECKED_BASE(_Last));
for (; _ChkFirst != _ChkLast; ++_ChkFirst)
_Func(*_ChkFirst);
return (_Func);
}
E> Кроме того если вызвать что-то типа foreach( i, *++vectors ), то будет а-та-та...
— Доктор, у меня болит когда я делаю вот так.
— Не делайте так (С)
E>Для третьего в нашей библиотеке уже есть похожий макрос, ну и вообще он обычно уже есть => не надо вводить свой, надо юзать стандартный.
Т.е. по сути это уже принято.
E>Так что нет все три раза.
Ясно.
А зачем это писать *быстро*? Да и вообще, зачем это писать?.. Особенно про WORD и DWORD...
E>>Кроме того у тебя в макросе предполагается, что CHAR_BIT равно 8, что не обязательно. CC>Это мелочь. Можно заменить на константу.
Это ошибка, а не мелочь...
CC>Но блин покажите мне промышленную систему где это не так, и для которой С++ компилятор поддерживает static_assert.
В чём проблема, написать свой переносимый аналог static_assert'а?.. E>>Для третьего в нашей библиотеке уже есть похожий макрос, ну и вообще он обычно уже есть очень во многих библиотеках => не надо вводить свой, надо юзать стандартный. CC>Т.е. по сути это уже принято.
Ну это много где принято. Но сами по себе программисты всё равно не должны писать свой макрос, но могут использовать библиотечный. E>>Второй -- нет. Во-первых, есть такая стандартная функция. CC>Это которая std::for_each? Сие есть редкостное говно, ибо не позволяет писать в виде:
Я от STL тоже сильно не в восторге. Но это не значит, что надо вводить макросы с именами очень похожими на стандартные функции...
E>>Во-вторых, он вводит в заблуждение. Если внутри цикла cont.end() поменяется, то всё гавкнется. CC>Правда почему то за пяток лет активного использования на практике никто на это так и не напоролся.
Ну, наверное, на практике, все знают, какие циклы так можно писать, а какие нет. То есть мысленно подставляют этот макрос в код и проверяют
CC>Кстати std::for_each также подвержен этой "беде".
Мы вроде как сошлись на том, что он ниже плинтуса? Или нет?
CC>- Не делайте так (С)
Дык это опять надо нигде не наколоться. То есть знать, что на самом деле этот макрос раскрывается в то-то... Например, так:
foreach( it, readVectorFromFile() );
тоже гавкнется...
В общем идея такая, что не так важна скорость набора кода, как скорость чтения/понимания/внесения правок.
Так что чем плодить макрос foreach берёшь да и пишешь всюду
for( auto it = cont.begin(), it != cont.end(); ++it ) {
}
А программист, который слишком медленно набирает тескт, берёт "соло" или другую такую же прогу и осваивает таки слепой десятипальцевый метод хотя бы на уровне 200 символов в минуту.
Ну а инвалид, который не может освоить 200 ударов в минуту, и мегамозг, из которого льётся С++ код с большей скоростью мне в подчинённые не нужны
Кстати, если бы внутри foreach сидела какая-то нетривиальная очень итерация и назывался бы он как-то forEachTreeNode, то можно было бы и посмотреть...
E>>Так что нет все три раза. CC>Ясно.
Ну и хорошо, что ясно.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, CreatorCray, Вы писали:
CC>Гм. У вас до сих пор работают люди, которые допускают такие детские ошибки?
Такие -- это какие?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
В общем лучше пользоваться библиотечным макросом...
C>Заодно не засоряем пространство имён.
Тогда надо без макроса как-то делать!
Как ты думаешь, читабелен ли такой синтаксис:
sizeof in_items( arr )
Мне лично, кажется извратом...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
CC>>Гм. У вас до сих пор работают люди, которые допускают такие детские ошибки? E>Такие -- это какие?
Непонимание как работают макросы
Здравствуйте, Erop, Вы писали:
E>А зачем это писать *быстро*? Да и вообще, зачем это писать?.. Особенно про WORD и DWORD...
Sanity check. Мало ли на какой экзотике это собирать вздумают.
CC>>Но блин покажите мне промышленную систему где это не так, и для которой С++ компилятор поддерживает static_assert. E>В чём проблема, написать свой переносимый аналог static_assert'а?..
А потом ещё и свой переносимый аналог С++0х? Чтоб остальное собралось.
E>>>Для третьего в нашей библиотеке уже есть похожий макрос, ну и вообще он обычно уже есть очень во многих библиотеках => не надо вводить свой, надо юзать стандартный. CC>>Т.е. по сути это уже принято. E>Ну это много где принято. Но сами по себе программисты всё равно не должны писать свой макрос, но могут использовать библиотечный.
В библиотеке оно само образовалось или всё таки сначала было написано программистом и потом включено в библиотеку?
Те же foreach и countof тоже сначала болтались в отдельных файла проекта, пока не стали настолько общеупотребляемыми что заняли своё место во фреймворке.
CC>>Кстати std::for_each также подвержен этой "беде". E>Мы вроде как сошлись на том, что он ниже плинтуса? Или нет?
Раз у стандартного та же "проблема", которую до сих пор так никто и не исправил, то значит это не очень то и проблема на самом деле. Не?
E>Дык это опять надо нигде не наколоться. То есть знать, что на самом деле этот макрос раскрывается в то-то...
Ну ведь знают же люди к примеру что стандартные макросы min и max во что то раскрываются. И что в целом в макросы подобные значения пихать не стоит тоже откуда то знают.
E>В общем идея такая, что не так важна скорость набора кода, как скорость чтения/понимания/внесения правок.
Дык цель любого макроса — заменить многабукаф на одно имя, в случаях когда запихивание этого кода в функцию менее эффективно. И foreach для читабельности и понимания несколько выгоднее чем for (многабукаф)
E>Так что чем плодить макрос foreach берёшь да и пишешь всюду [c]for( auto it = cont.begin(), it != cont.end(); ++it ) {
Писал, но крайне быстро задрало. Да и читать это потом не очень.
Здравствуйте, CreatorCray, Вы писали:
CC>Непонимание как работают макросы CC>
CC>int mx = MAX( *q++. *q++ );
CC>
Не всегда легко понять кто именно тут макрос
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском