Линус про C++

pilot

On Wed, 5 Sep 2007, Dmitry Kakurin wrote:
>
> When I first looked at Git source code two things struck me as odd:
> 1. Pure C as opposed to C++. No idea why. Please don't talk about portability,
> it's BS.

*YOU* are full of bullshit.

C++ is a horrible language. It's made more horrible by the fact that a lot
of substandard programmers use it, to the point where it's much much
easier to generate total and utter crap with it. Quite frankly, even if
the choice of C were to do *nothing* but keep the C++ programmers out,
that in itself would be a huge reason to use C.

In other words: the choice of C is the only sane choice. I know Miles
Bader jokingly said "to piss you off", but it's actually true. I've come
to the conclusion that any programmer that would prefer the project to be
in C++ over C is likely a programmer that I really *would* prefer to piss
off, so that he doesn't come and screw up any project I'm involved with.

C++ leads to really really bad design choices. You invariably start using
the "nice" library features of the language like STL and Boost and other
total and utter crap, that may "help" you program, but causes:

- infinite amounts of pain when they don't work (and anybody who tells me
that STL and especially Boost are stable and portable is just so full
of BS that it's not even funny)

- inefficient abstracted programming models where two years down the road
you notice that some abstraction wasn't very efficient, but now all
your code depends on all the nice object models around it, and you
cannot fix it without rewriting your app.

In other words, the only way to do good, efficient, and system-level and
portable C++ ends up to limit yourself to all the things that are
basically available in C. And limiting your project to C means that people
don't screw that up, and also means that you get a lot of programmers that
do actually understand low-level issues and don't screw things up with any
idiotic "object model" crap.

So I'm sorry, but for something like git, where efficiency was a primary
objective, the "advantages" of C++ is just a huge mistake. The fact that
we also piss off people who cannot see that is just a big additional
advantage.

If you want a VCS that is written in C++, go play with Monotone. Really.
They use a "real database". They use "nice object-oriented libraries".
They use "nice C++ abstractions". And quite frankly, as a result of all
these design decisions that sound so appealing to some CS people, the end
result is a horrible and unmaintainable mess.

But I'm sure you'd like it more than git.

Linus

отсюда

Marinavo_0507

Его бы к нам на форум. Отцы бы его быстро научили, как вести крупные проекты. А в той рассылке ламеры не смогли дать отпор.

dgaf

недавно Луговский на форуме sql.ru отжигал про С++ примерно в таком же ключе.

Landstreicher

Честно говоря, не очень понятно в чем суть претензий к C++. Много эмоций, но ни одного конкретного недостатка не указано.
Я достаточно часто пишу что-то на C++ и нахожу, что для ряда программ этот язык отлично подходит.
То есть, бывают конечно проблемы, типа утечек памяти или сегфолтов, но они ведь и в C точно такие же проблемы бывают.
В качестве примера могу привести транслятор DNA->RNA, который я писал совместно с . Вот его (надо переименовать в *.cpp после скачки). IMHO это очень типичный код на C++. IMHO для этой решения этой задачи C++ подходит лучше, чем C или более высокоуровневые языки типа C#, Java, ML. Если кто-то согласен с мнением Линуса — объясните, плз, чем плох C++ для решения этой задачи.

spitfire

Мне C++ не нравится разве что некоей "среднеуровневостью", когда наряду с нормальным, вобщем-то, явлением ссылок существуют указатели на память. Зачем ОО-языку указатели-то?

pilot

Про задачу ничего не понятно.
Сырцы не смотрел. Документация, описание есть?

Landstreicher

> Про задачу ничего не понятно.
> Сырцы не смотрел. Документация, описание есть?
Описание задачи: http://www.icfpcontest.org/Endo.pdf

vall

сырцы смотрел по диагонали.
не заметил там ничего что бы не реализовывалось на С c 5% увеличением размера кода.
если использовать С++ просто как такой синтаксический сахар то зачем вся та остальная хренотень что накручена в нём? про ахтунг который творят в boost я вообще молчу. =)

oleg_n

не стоит делать выводы на основе C++ кода объёмом в 1000 строк
вопрос поставлен шире

pitrik2

не заметил там ничего что бы не реализовывалось на С c 5% увеличением размера кода.
+1
и тем более непонятно, почему это там джава не пойдет?
с точки зрения простоты и быстроты и даже синтаксиса в таких простых задачах она у с++ токо выигрывает
а заодно +1 к Ильдару
что хотел сказать Линус понятно
ответом ему могут быть только действительно огромные программы
а про это совсем недавно был тред

tokuchu

ответом ему могут быть только действительно огромные программы
Типа ядра Linux?

Marinavo_0507

в ядре linux полно утечек и порчи памяти (в релизах)
а в профессиональных проектах, разрабатываемых профессионалами профессиональными инструментами, такого не должно быть

tokuchu

в ядре linux полно утечек и порчи памяти (в релизах)
а в профессиональных проектах, разрабатываемых профессионалами профессиональными инструментами, такого не должно быть
Время работы ядра теоретически превышает время работы процесса.
Где утечки более страшны будут?

Marinavo_0507

ход твоих мыслей слишком сложен для меня

Papazyan

C++ плох тем, что он очень сложный. Причем сложный не столько концептуально, сколько во всяких мелочах.

oleg_n

действительно огромные программы
что это за звери такие?!

vall

что это за звери такие?!
openoffice.org

Olenenok

Eclipse

enochka1145

Опять 25.
C++ нацелен на то, чтобы быть универсальным и позволять производить высокоэффективный код.
Не хочешь использовать C++ - не используй.

vall

Eclipse
Ч_о? где там много C++?

Landstreicher

> сырцы смотрел по диагонали.
> не заметил там ничего что бы не реализовывалось на С c 5% увеличением размера кода.
Плохо смотрел сырцы. Там интенсивная работа с std::string и std::vector. На C++ я могу спокойно писать string a = b; a += c; и не думать на тему кто, когда должен выделять и освобождать память. На C я бы заебался писать все время malloc/realloc/free и думать, а нужно ли копировать эту строку или можно менять in-place? Это отнюдь не 5% от объема — это гораздо больше.
Возможность человеческой работы со строками — это огромное преимущество C++ по сравнению с C, гораздо больше, чем просто синтаксический сахар.

Oper

Зато смог бы последовательность размеров соптимизировать под конкретную задачу.

evgen5555

Возможность человеческой работы со строками — это огромное преимущество C++ по сравнению с C
Естественно, когда дело не касается форматированного вывода числовых данных.

Landstreicher

> C++ плох тем, что он очень сложный. Причем сложный не столько концептуально, сколько во всяких мелочах.
Полностью согласен. Когда читаешь описание правил разрешения перегрузки — сильно хочется застрелить авторов.
Но ведь с другой стороны, никто не заставляет все эти фичи использовать. Если, например, ты посмотришь код для ICFPC, который я запостил, то он достаточно простой. Там нет шаблонов, нет перегрузок, нет специализаций. Большинство функций написаны в top-level, без включения в классы. Почти нет наследования и виртуальных методов. IMHO так и надо писать на C++. IMHO если писать программы типа GIT в таком стиле, то все будет ок. Не вижу тут проблем.
Если же люди начинают в простых программах использовать какие-то зверские сложные фичи — это только от неумения программировать. Опытный программист будет стараться писать наиболее простой код.

Papazyan

Если же люди начинают в простых программах использовать какие-то зверские сложные фичи — это только от неумения программировать. Опытный программист будет стараться писать наиболее простой код.
Может и так, но на собеседованиях требуется знать как раз зверские фичи.

Landstreicher

> и тем более непонятно, почему это там джава не пойдет?
> с точки зрения простоты и быстроты и даже синтаксиса в таких простых задачах она у с++ токо выигрывает
Ты тоже плохо смотрел код. Посмотри, там используются указатели, собственный аллокатор памяти, и даже некоторое подобие copying garbage collector. Как ты такое будешь на Java делать?

pitrik2

IMHO так и надо писать на C++.
имхо это ЖЕСТЬ

tokuchu

Но ведь с другой стороны, никто не заставляет все эти фичи использовать. ...
IMHO если писать программы типа GIT в таком стиле, то все будет ок. Не вижу тут проблем.
Если же люди начинают в простых программах использовать какие-то зверские сложные фичи — это только от неумения программировать. Опытный программист будет стараться писать наиболее простой код.
Тогда зачем в C++ всё остальное? Причём многие его всё же используют.

tokuchu

IMHO так и надо писать на C++.
имхо это ЖЕСТЬ
Да нет, просто он на самом деле программирует на C и не признаётся. От C++ ему только syntactic sugar нужен, который можно было бы заменить какими-нибудь библиотеками, но, правда, операторы перегрузить не получится.

Landstreicher

> Да нет, просто он на самом деле программирует на C и не признаётся.
> От C++ ему только syntactic sugar нужен, который можно было бы заменить какими-нибудь
> библиотеками, но, правда, операторы перегрузить не получится.
А std::string — это тоже syntactic sugar?

Landstreicher

> имхо это ЖЕСТЬ
Почему? Если ты видишь, что применение каких-то модных C++-фич способно улучшить программу, которую я привел, — покажи, как именно.

pitrik2

Почему? Если ты видишь, что применение каких-то модных C++-фич способно улучшить программу, которую я привел, — покажи, как именно.
нет
я считаю то что, эта прога прекрасно была бы написана на Си и на любом другом языке
я не говорю, что следовало бы писать на другом языке, каждый пускай пишет на том к чему привык, на чем ему удобно
речь про то, что ты неудачный пример привел, пример который не противореит тому о чем говорил линус

Landstreicher

> не стоит делать выводы на основе C++ кода объёмом в 1000 строк
> вопрос поставлен шире
А что, разве система контроля версий — это большая программа? Это же не какой-нибудь там OpenOffice или Firefox.

Olenenok

Вот, вся фишка в том, что проект сложный. Поэтому языком и была выбрана Java, а не C++

Landstreicher

> я считаю то что, эта прога прекрасно была бы написана на Си и на любом другом языке
Не согласен с тобой. Я считаю, что при написании ее на C был бы большой геморрой в выделением и освобождением памяти из-за отсутствия std::string.
Вот возьми, например, такую функцию:

static std::string protect(int l, const std::string& s)
{
std::string d = s;
while (l > 0) {
d = quote(d);
l--;
}
return d;
}

Как бы ты написал ее на C?

pitrik2

Как бы ты написал ее на C?
я на си уже давно не пишу
потому вопрос не ко мне
ща попытаюсь обяснить
я могу написать это на си, получится наверна громоздко, я не знаю всяких удобных либ типа буста и так далее
человек который пишет на си, тот будет все это знать
у него код будет понятным и коротким

Vladislav177Rus

boost::format

pilot

Поэтому языком и была выбрана Java, а не C++
Про Java:
10. The wrong people like it. The programmers I admire most are not, on the whole, captivated by Java. Who does like Java? Suits, who don't know one language from another, but know that they keep hearing about Java in the press; programmers at big companies, who are amazed to find that there is something even better than C++; and plug-and-chug undergrads, who are ready to like anything that might get them a job (will this be on the test?). These people's opinions change with every wind.

Olenenok

Ну и что? Я, вот, терпеть не могу Дельфи. Но заметил, что кодю на нём быстрее, чем на С++, хотя знаю его (Дельфи) хуже чем C++. Речь идёт не про приложения гуи, если что. Жабко в этом отношении ещё лучше Дельфи, ГЦ решает.
А статья эта - просто отражение мнения красноглазых фанатов Пёрла.

pilot

фанатов Пёрла
Лиспа. Учи матчасть :-)

Olenenok

Им там и пёрл нравился

oleg_n

> А что, разве система контроля версий — это большая программа?
где я писал, что систему контроля версий не стоит писать на C++?
> А std::string — это тоже syntactic sugar
перегрузка операций - это унифицированное средство создания syntactic sugar
вон в куче языков нет такой перегрузки, но ввели стандартные типы а-ля string, vector
и никто такую перегрузку не просит
overkill получается?
> Возможность человеческой работы со строками — это огромное преимущество C++ по сравнению с C
где ты там человеческую работу со строками увидел?
хинт: сравни с перлом

kokoc88

Если ты видишь, что применение каких-то модных C++-фич способно улучшить программу, которую я привел, — покажи, как именно.
Я не знаю, как часто вызывается protect и quote в нём, а так же какая длина у строк. Поэтому пишу от балды. Добавим класс protector вместо функций. Тогда мы легко уменьшим количество new/delete/memcpy в программе и получим примерно 5-20% прибавки к производительности. Это не модные Си++ фичи, это просто фичи.
Хотя вся задача на самом деле счётная и в итоге порулит алгоритм, а не какие-то частные оптимизации. (Впрочем, при строках длиной 2кб и уровне защиты 10 разница уже весьма ощутима.)

apl13

На C я бы заебался писать все время malloc/realloc/free
#ifndef CONCAT
#define CONCAT(x, y) {(x) = realloc(length(x) + length(y) + 1); (x) = strcat(x, y);}
#endif

kruzer25

Такое использование препроцессора - зло.

apl13

Обоснуй! (c)

oleg_n

вместо макросов надо писать нагромождение языковых конструкций

apl13

Вот так: ?

kruzer25

ОК.
Вот ищешь ты баг в огромной программе, и натыкаешься на использование функции concat. Такой стандартной функции нет. Где искать её определение - хз. Что она делает - хз. Что ей можно дать - хз. Что она вернёт - хз.
Или ищешь ты баг в огромной программе (например, выдалась при компиляции сообщение о синтаксической ошибке и натыкаешься на определение такой функции. Твой concat - это ещё хорошо, там определение короткое, а если там кода на несколько килобайт? Как в них искать синтаксическую ошибку?

Dasar

> Обоснуй! (c)
вот так писать будет можно?
если нет, то как это быстро понять по коду?

CONCAT(CONCAT(x, "a" "b")

да, и остается та же проблема, что и для strcat, что и вот так - почему-то писать нельзя

CONCAT("a", "b")

SCIF32

Вообще, этот рассказ надо было стилизовать под хоррор.

oleg_n

программирование, сцуко, пиздец опасное занятие

kruzer25

да, и остается та же проблема, что и для strcat, что и вот так - почему-то писать нельзя
Ага, Петя написал этот макрос, Вася использует его как функцию - и никак не поймёт, почему у него ничего не компилируется. А может быть и хуже - что компилируется, но неправильно работает.

feliks28

Ага, Петя написал этот макрос, Вася использует его как функцию - и никак не поймёт, почему у него ничего не компилируется. А может быть и хуже - что компилируется, но неправильно работает.
Я что-то понять не могу: а почему то, что Вася использует в своей программе то, чего он не понимает, должно быть проблемой Пети?

kokoc88

realloc
В этой задаче и так хватает нагрузки на malloc. Тебе надо хотя бы добавить логарифмическое наращивание памяти. (Встроенное в std::string).

pitrik2

Где искать её определение - хз. Что она делает - хз. Что ей можно дать - хз. Что она вернёт - хз.
глупости
CONCAT написано большими буквами
значит это макрос
где искать - в одм из заголовочных файлов
там же и смотреть что делает

apl13

+1
Где искать её определение - хз. Что она делает - хз. Что ей можно дать - хз. Что она вернёт - хз.
[Не для пацанов]grep 'define CONCAT' *[/не для пацанов]
а если там кода на несколько килобайт? Как в них искать синтаксическую ошибку?
В MESE, кстати, бывают такие макросы, если меня не глючит. Хотя я бы посоветовал не писать многокилобайтный код в макросе.
2
char *concat(char *x, char *y) {
x = realloc(length(x) + length(y) + 1);
x = strcat(x, y);
return x;
}


В этой задаче и так хватает нагрузки на malloc. Тебе надо хотя бы добавить логарифмическое наращивание памяти. (Встроенное в std::string).
Меня глючит, или те, кому нужна производительность, в цирке не сме... тьфу, в Си++ не ходят?
Вообще, потом можно поступить так:
#ifdef GEEK_ZONE
#ifdef CONCAT
#undef#CONCAT
#define CONCAT /* so it may work FASTER and EFFICIENTLY */
#endif
#endif

pitrik2

кстати в тру языке лиспе большие макросы обычное дело

kokoc88

Меня глючит, или те, кому нужна производительность, в цирке не сме... тьфу, в Си++ не ходят?
Тебя глючит. На Си++ string+string отпипирит твою реализацию CONCAT по всем параметрам. (От безопасности по типам до скорости работы.)

apl13

кстати в тру языке лиспе большие макросы обычное дело
И я так понимаю, в сем языке макросы такие, что дай Бог каждому!

apl13

Потом я перепишу и отполирую свою реализацию. Перестанет ли от этого меня глючить? :]

kokoc88

Потом я перепишу и отполирую свою реализацию. Перестанет ли от этого меня глючить?
Тебя перестанет глючить, когда ты перестанешь курить траву.

kruzer25

[Не для пацанов]grep 'define CONCAT' *[/не для пацанов]
Да - пацаны, если ч0, когда хотят узнать, что это за функция - пользуются всплывающей подсказкой или переходят к определению по какому-нибудь CtrlClick.
Но переключаться в консоль и запускать поиск "define\s+CONCAT" по мегабайтам проекта, причём CONCAT (или SOMELONGNAMEFORFUNCTIONTHATDOINGMANYTHINGSANDACCEPTSABOUTDOZENOFPARAMETERS) придётся вбивать вручную/вставлять из буфера обмена.

Papazyan

кстати в тру языке лиспе большие макросы обычное дело
Ты не путай их с С-шными. Это как Ж и П сравнивать.

apl13

причём CONCAT (или SOMELONGNAMEFORFUNCTIONTHATDOINGMANYTHINGSANDACCEPTSABOUTDOZENOFPARAMETERS) придётся вбивать вручную/вставлять из буфера обмена.
[Обратно не для пацанов]Middle-click[/обратно не для пацанов]

kruzer25

И в какой IDE можно по таким макросам ходить?

pitrik2

[Обратно не для пацанов]Middle-click[/обратно не для пацанов]
конечно не для пацанов
не было никаких мидлкликов раньше
левая+правая вместе

apl13

Я слишком юн!..

apl13

X Window System называется, а вообще, не понял сообщения, там, походу, потерялось процентов тридцать при передаче...

oleg_n

каким макросам?

kruzer25

Повторю ещё раз.
Какая IDE позволяет тебе по среднему клику на вызове функции/макроса CONCAT перекидывать тебя к определению этой функции/макроса?

Dasar

любая IDE. разве нет?

kruzer25

Разве да?
Я понимаю, что любая приличная перейдёт к описанию функции... а что, с макросами они тоже работают?
ЗЫ: Ч0рд, мой Eclipse не умеет работать с C, не проверить...

Dasar

если это IDE, то да, перейдет

Olenenok

cdt

pilot

кстати в тру языке лиспе большие макросы обычное дело
On Lisp
When to Use Macros
How do we know whether a given function should really be a function, rather than
a macro? Most of the time there is a clear distinction between the cases which
call for macros and those which don’t. By default we should use functions: it is
inelegant to use a macro where a function would do. We should use macros only
where they bring us some specific advantage

kokoc88

In other words: the choice of C is the only sane choice.
Ага, и перед каждым return SOME_ERROR вставлять free, close, release_mutex,... malloch-ные реки, deadlock-нутые берега. Или освобождение памяти и многопоточность - это тоже от лукавого?
I really *would* prefer to piss off

Да он изначально послал всех на хуй. Как ему могли хоть что-то объяснить?
infinite amounts of pain when they don't work

Кроссплатформенный Си напичкан тем же количеством #ifdef'ов, как и Си++
inefficient abstracted programming models where two years down the road
you notice that some abstraction wasn't very efficient, but now all
your code depends on all the nice object models around it, and you
cannot fix it without rewriting your app

Правильно. К чёрту любые структуры, мы будем наращивать кучу функций, которые хаотично вызывают друг-друга. Вообще-то программирование подразумевает создание какой-то архитектуры, и если эта архитектура плохая, то нельзя обвинять в этом язык программирования. Тем более, Си++ не диктует никаких жёстких правил.
In other words, the only way to do good, efficient, and system-level and
portable C++ ends up to limit yourself to all the things that are
basically available in C.

Чувак просто всю свою жизнь писал драйверы. Во всяком случае, он совсем не понимает, как удобны деструкторы и исключения.
So I'm sorry, but for something like git, where efficiency was a primary
objective, the "advantages" of C++ is just a huge mistake.

Так надо было сразу писать на ассемблере под все известные процессоры...

pilot

На самом деле точка зрения, которая мне нравится, такая:
Писать надо на С, используя от С++ только syntactic sugar.
Если посмотреть на приведенные тут примеры, то они написаны на примитивном С++. Вот только такой и надо использовать.
Без всяких виртуалов, друзей и прочей лабуды.

oleg_n

линус долбоёб, да
это всем известно

danilov

Это как купить мерс и прикрутить его гайки на свой старенький москвич
C и С++ - это два разных языка. Сишники никогда не смогут прогать не C++, пока не начнут учить его заново.

kokoc88

Писать надо на С, используя от С++ только syntactic sugar.
Если посмотреть на приведенные тут примеры, то они написаны на примитивном С++. Вот только такой и надо использовать.
Без всяких виртуалов, друзей и прочей лабуды.
Смотря что ты считаешь сахаром. Как на Си ты будешь делать паттерн visitor? А scoped ресурсы? А функции, которые возвращают значения, а в случае ошибок выкидывают исключения, чтобы не проверять код возврата на каждой второй строке? А параметризуемые решения, типа контейнеров и прочего? Так получится, что виртуальные функции, деструкторы, исключения, шаблоны - тоже сахар.

kokoc88

Сишники никогда не смогут прогать не C++, пока не начнут учить его заново.
У Си-шников ещё беда: они гонятся за производительностью там, где нужна стабильность и простота исполнения.

oleg_n

> У Си-шников ещё беда: они гонятся за производительностью там, где нужна стабильность и простота исполнения.
это ты сам придумал?
мне совсем не понятно, на основании каких фактов ты делаешь такие выводы?

pilot

C и С++ - это два разных языка.
Ага, и во втором есть несколько полезных вещей.

kokoc88

Ага, и во втором есть несколько полезных вещей.
Ну так ты напиши, какие по-твоему являются бесполезными?

Dasar

наличие h-ников, вернее, требование, чтобы тип или функция был определен до использования
раздельная компиляция и линковка

apl13

Какая IDE позволяет тебе по среднему клику на вызове функции/макроса CONCAT перекидывать тебя к определению этой функции/макроса?
Вообще-то, я тебе ответил.

kokoc88

наличие h-ников, вернее, требование, чтобы тип или функция был определен до использования
раздельная компиляция и линковка
Ты написал, что требования и реализации языка являются бесполезными. Так я могу сказать, что установка .NET Framework - лишняя в языке C#
Вопрос был про конструкции языка.

pilot

У Си-шников ещё беда: они гонятся за производительностью там, где нужна стабильность и простота исполнения.
Беда С++ников: они не знают удобных языков, на которых можно писать программы, требующие не производительности, а стабильности и простоты исполнения.

kokoc88

Беда С++ников: они не знают удобных языков, на которых можно писать программы, требующие не производительности, а стабильности и простоты исполнения.
Беда тех, кто знает слишком много "удобных языков": они не знают Си++ достаточно, чтобы понять, как он прост для написания стабильных и простых программ.

Olenenok

Что-то мне не кажется, что код на цепепе читается лучше чем сишный. Ровно наоборот. Причём сравниваю "заведомо некачественное открытое" приложение с кодом одной, довольно уважаемой конторы.
Хотя на цепепе писать быстрее чем на си.

Dasar

> Вопрос был про конструкции языка.
наличие определение до использования - это именно конструкция языка, это даже в стандарте C++ зафиксировано
ps
необходимость установки .net-а для C# - в стандарте C# почему-то не описана

kokoc88

наличие определение до использования - это именно конструкция языка, это даже в стандарте C++ зафиксировано
Я же сказал, что требования языка не могут являться "бесполезными". Под бесполезными в контексте данного топика понимаются конструкции, без которых можно и нужно программировать на этом языке. Таким образом, из Си++ можно сделать какое-то подобие Си-с-плюшками.
необходимость установки .net-а для C# - в стандарте C# почему-то не описана
Не описана, но тем не менее необходима. Так что требования есть у любого языка. И неудобства тоже.

kokoc88

Что-то мне не кажется, что код на цепепе читается лучше чем сишный.
Два куска кода, без особой логики. Скажи мне, что читается лучше.
struct some_context
{
int my_mutex;
const char* my_error;
double my_o1;
double my_o2;
};

void lock(int mutex)
{
}

void unlock(int mutex)
{
}

bool operation1(struct some_context* pctx, double* pres)
{
if (false /* some error */)
{
pctx->my_error = "some error";
return false;
}
*pres = pctx->my_o1;
return true;
}

bool operation2(struct some_context* pctx, double* pres)
{
if (false /* some error */)
{
pctx->my_error = "some error";
return false;
}
*pres = pctx->my_o2;
return true;
}

bool operation3(struct some_context* pctx, double operand, double* pres)
{
if (operand < 0.0)
{
pctx->my_error = "some error";
return false;
}
*pres = operand;
return true;
}

bool operation(struct some_context* pctx)
{
pctx->my_error = NULL;
lock(pctx->my_mutex);
double o1;
if (!operation1(pctx, &o1
{
unlock(pctx->my_mutex);
return false;
}
double o2;
if (!operation1(pctx, &o2
{
unlock(pctx->my_mutex);
return false;
}
double o3;
bool res = operation3(pctx, o1+o2, &o3);
unlock(pctx->my_mutex);
return res;
}
class some_class
{
public:
void operation
{
boost::mutex::scoped_lock lock(m_mutex);
operation3(operation1 + operation2;
}

double operation1
{
if (false/* some error */)
throw std::runtime_error("some error");
return m_o1;
}

double operation2
{
if (false/* some error */)
throw std::runtime_error("some error");
return m_o2;
}

double operation3(double operand)
{
if (operand < 0.0)
throw std::runtime_error("some error");
return operand;
}

private:
double m_o1;
double m_o2;
boost::mutex m_mutex;
};

oleg_n

это отличная идея, предполагать, что люди, читающие тебя, полные долбоёбы

pilot

Гы
The Truth About Lisp
In which the truth about lisp is revealed, and some alternatives are enumerated.
Learning lisp will alter your life.
Your brain will grow bigger than you ever thought possible.
You will rewrite all of your applications in just a handful of lines
Society will shun you. You will shun society.
You will become disatisfied with everything and everyone around you.
Lisp is so simple to learn that you can learn lisp in just a few minutes. I just learnt it now while I was waiting for a bus.
Lisp is so simple that you can implement it in any language in just a few pages of code. This might never happen though, because once you've learnt lisp you'd never want to write anything in any language other than lisp, so you wouldn't bother implementing lisp in any language other than lisp.
Lisp can be fully implemented in lisp in just a handful of lines. I just implemented lisp in lisp, fully, while i was hopping onto a bus and paying for my bus ticket all at the same time.
When you become a lisper, you will laugh at jokes that no one else thinks are funny. You will know things that cannot be expressed in ordinary imperative language.
You will think people are idiots when they state things like "Hi, how are you?" because a lisper simply doesn't need to use such verbose constructs. Lisp abstracts away those patterns of interaction and makes them completely irrelevant. The proper way to greet a fellow lisper is just a tiny nod of the chin, and about a tenth of a wink from your left eye, then point at your tin foil hat. They will know what you mean. if they don't know what you mean then they are not a true lisp programmer and they don't matter anyway.
Lisp was invented a long time ago, before java, before C, before fortran, before computers, before people, before the earth was built. the universe itself is a lisp program so trivial that no true lisper would even both implementing it.
Lisp is so elegant that the very fact that you know even the first thing about it will qualify you for a season as principal dancer of the royal ballet. You will go out on stage in your little tutu and just scribble a few round brackets in the air with your toe. People will gasp in wonder. Unless they don't know any lisp. If they don't know any lisp then they are idiots and they don't matter.
Only lispers have a true definition of fun. Maybe ML programmers too. All of today's languages are based on fortran and lisp. The bad bits fortran, the good: lisp.
If you're good enough to use lisp, you'll soon be frustrated with lisp. Lisp is not an adequate lisp. By the time my bus had made it two blocks I'd written some simple lisp macros that were so powerful they made lisp completely obsolete and replaced it with a new language. Fortunately, that new language was also called lisp. And i was able to prove, mathematically, that the new lisp i'd created was both far superior to lisp in every conceivable way, but also exactly equivalent to lisp in every possible way. I was very excited by this. But also found it very boring.
Reddit is proof that lisp is really powerful. Paul Graham originally wrote reddit, in lisp, on the back of a napkin while he was waiting for a coffee. it was so powerful that it had to be rewritten in python just so that ordinary computers could understand it. Because it was written in lisp it was almost no effort to rewrite the entire thing, and the rewrite was completed in-between two processor cycles. Paul Graham himself was completely written in lisp, by an earlier version of himself, also written in lisp, by an earlier version of lisp. It's lisp, paul graham, lisp, paul graham, all the way down.
Because we've reached the limits of moore's law, the computers of the future will have many-core processors and all our programs will need to be written in a combination of haskell and lisp, that will itself be so powerful that the computers of the future will not be able to implement any of our ideas without creating time-travelling algorithms that borrow processing power from other computers that are further into the future. This sounds difficult, but in lisp it isn't difficult at all. in haskell this is a built-in feature and the way you implement it is just a no-brainer to any one who knows lisp or haskell.
After that, the computer of the future will be called The Lisputer. It's speed will be measured using the Lispunit, which is a measure of how many simultaneous arguments about the inadequacy of lisp can be proposed and defeated by an infinite number of lisp pundits without any actual decisions being made. Today's computers run at just under one lispunit. The Lisputer will run at lisp Lispunits, where lisp is a fundamental maximum constant of the universe that can't be expressed using ordinary imperative numerals. Suffice to say that it ends with an infinite number of closing parentheses.
Anyway. i read an article about lisp on the bus today. Top article. All the articles on lisp are really full on — my brain starts to explode out my ear. This one, lisp is sin, was by Sriram Krishnan, in which he talked about doing C# for work, but Lisp for fun. And he touched on some of the ways in which C# is moving toward lisp.
Here's some of the technologies that the commentors at that article suggested as possible substitutes for a lisp addict:
1. newLisp
2. ML
3. Perl6
4. nermerle
5. smalltalk
6. biobike
7. chez scheme
8. Common Larceny
9. XSLT
10. OCaml
11. L
12. Lua
13. C Omega
14. F#
15. C# with Linq
Also, one person suggested porting the python libraries to lisp.
Curious for its absense: Ruby (see article Why Ruby is an acceptable lisp, and steve yegge's response: 'lisp is not an acceptable lisp')
(p.s. first person to write a comment that says "Paul Graham did not write reddit" deserves a lollipop.)

kokoc88

это отличная идея, предполагать, что люди, читающие тебя, полные долбоёбы
Ты что влезаешь? Выше для умных написаны аргументы, теперь я их разжёвываю тем, с кем не согласен, чтобы понять, в чём мы расходимся.

Dasar

Я же сказал, что требования языка не могут являться "бесполезными".
почему? это совсем неочевидно

myrka68

извините, что влезаю в разговор больших дядек
, ты постоянно упираешь на ООП, но кроме него существуют и другие парадигмы =)
а в ООП C# и Java поудобнее C++ будут

kokoc88

почему? это совсем неочевидно
Потому что без них язык не работает?! Ты ещё не понял, что приводишь примеры, которые не отвечают на мой вопрос? Ещё раз: речь идёт о программировании на языке, с принципиальным отказом от каких-то конструкций этого языка, и объявлением их бесполезными. Я прошу привести пример таких конструкций.

kokoc88

а в ООП C# и Java поудобнее C++ будут
Все эти три языка эквивалентны с этой точки зрения.

conv3rsje

не передергивай
особенно порадовало
"сравним прогу на С и прогу на плюсах с бустом"
в твоем примере большая часть остается за кадром

kokoc88

в твоем примере большая часть остается за кадром
И что с того? На ассемблере всё будет выглядеть вообще одинаково. Смысл-то не в этом. На Си++ я заверну в деструктор что угодно и потом буду везде использовать. А на Си ты всегда будешь всё делать руками.

conv3rsje

буду
плюсы провоцируют на раздолбайство
"ааа, деструктор все сделает..."
или напихают в деструкторы всякого барахла а потом мучаются с тем, что
точка в которой он вызовется находится совсем не там где кажется

Dasar

плюсы провоцируют на раздолбайство
ага, а компьютер вообще оттучает думать...

conv3rsje

было бы смешно, не будь это так...

Oper

ООП для тех, кто ниасилил концепцию процедурного программирования ?

kokoc88

плюсы провоцируют на раздолбайство
Конечно, лучше руками освобождать все ресурсы в каждой функции. А потом где-нибудь забыть что-то освободить. Желательно там, где возвращается ошибка, которая происходит только в продакшн билде у клиента.
или напихают в деструкторы всякого барахла а потом мучаются с тем, что
точка в которой он вызовется находится совсем не там где кажется

Ни разу не мучался от того, что у меня вызываются деструкторы. Да и за точками вызова следит компилятор.

conv3rsje

об этих точках как раз должен думать афтар
пример - утечки незакрытых сокетов во всяких жабах, где надеются на то, что деструктор все закроет
а деструктор вызывается хрен знает когда, когда fd limit уже давно исчерпан
это, конечно, не плюсы, но там тоже хватает

kokoc88

пример - утечки незакрытых сокетов во всяких жабах, где надеются на то, что деструктор все закроет
а деструктор вызывается хрен знает когда, когда fd limit уже давно исчерпан
это, конечно, не плюсы, но там тоже хватает
Пример про языки с GC, которые к данной дискуссии не имеют никакого отношения. Мало того, я давно не видел профессионального программиста на C#/Java, который "надеется на деструктор". (Кстати, в этих языках это обычно называется finalizer.)
В Си++ деструктор вызывается гарантированно. Поэтому он надёжен во всех случаях.

conv3rsje

я не говорю что он не вызывается
в жабе вон тоже вызывается
просто пример с ГЦ наиболее показателен, там особо объяснять не надо что происходит
а в плюсах можно огрести когда происходит
копирование по значению в каком-нибудь контейнере
(не надо про autoptr, я тоже знаю что это ниибацки круто)

oleg_n

> Ты что влезаешь? Выше для умных написаны аргументы, теперь я их разжёвываю тем,
> с кем не согласен, чтобы понять, в чём мы расходимся.
ой извини, я что-то не догадался, что тут не форум, а приватная переписка
правильно ли я понял, что все (повторяю, все) твои аргументы сводятся к следующему
"C++ обратно совместим с С, всё, что можно писать на С отлично пишется на С++ -> C++ лучше"
мысль настолько проста, и, постарайся в это поверить, её отлично понимает линус
ты пытаешься разжевать это утверждение -> считаешь, что читающие тебя глупы
наверняка, линус, ругая С++, подразумевает некое сакральное знание, которое тебе не доступно

oleg_n

имеет смысл ограничить обсуждение примерами тех программ, которые стоит писать на С++
тот финансовый софт, который писал на плюсах я, лучше было бы писать на каком-нибудь питоне
всё равно основные задержки на БД и сети происходят

kokoc88

правильно ли я понял, что все (повторяю, все) твои аргументы сводятся к следующему
"C++ обратно совместим с С, всё, что можно писать на С отлично пишется на С++ -> C++ лучше"
Ты понял неправильно. Значит, примеры кода на Си и Си++ как раз для тебя. Погляди на них, подумай. Там всего два аспекта: обработка ошибок и захват ресурсов. В жизни эти функции могут быть в десятки строк, а ошибок гораздо больше, ровно как и мест, где эти ошибки надо проверять. Когда и если поймёшь этот мой пример, я приведу тебе другие удобства Си++ по сравнению с Си.

kokoc88

всё равно основные задержки на БД и сети происходят
Я не понял, при чём тут задержки...

oleg_n

Эх.. говорила ведь мама, что когда пытаешься спорить с долбоёбом сам становишься долбоёбом

oleg_n

в том смысле, что производительность С++ не нужна

kokoc88

Эх.. говорила ведь мама, что когда пытаешься спорить с долбоёбом сам становишься долбоёбом
Не волнуйся, я долбоёбом не стану. Просто попытайся аргументировать, может быть, у тебя что-то получится.

pilot

удобства Си++ по сравнению с Си
А расскажи про удобства Си++ по сравнению с Питон+Си? Питон для логики, Си для счета.

alexander06

Эх.. говорила ведь мама, что когда пытаешься спорить с долбоёбом сам становишься долбоёбом
+1

alexander06

Питон для логики
совсем нелогично
для логики есть более правильные языки
питон - для грязных хаков

kokoc88

А расскажи про удобства Си++ по сравнению с Питон+Си? Питон для логики, Си для счета.
boost::python

oleg_n

научные приложения, мультимедиа, игры
где ещё счёт нужен?

conv3rsje

Один язык - можно набирать более туп... неквалифицированных работников - можно сэкономить на зарплате

alexander06

а boost::brain уже изобрели?

oleg_n

деньги вообще на 1С надо зарабатывать

pilot

есть более правильные языки
Приведи примеры? Я согласен, но все же. Языки на которых можно написать коммерческий софт. Не считая всяких жаб, сишарпа и пехепе.

alexander06

коммерческий софт на питоне... хз, может и есть такие герои =)
а так для логики можно использовать такие отличные языки как ocaml, haskell, lisp
З.Ы. пхп сосёт, пернартуру привет =)

oleg_n

Civ4 на питоне

pilot

Героев таких полно. Гугл даже вроде.
Про ПХП +1.
А Хаскель, Лисп и Окамл — это игрушки, серьезной софтины не напишешь. Сами с Лиспом мучаемся.
Так что Питон и Руби(тот же питон для веб). Мб Перл, про него мало знаю.

Chupa

> особенно порадовало
> "сравним прогу на С и прогу на плюсах с бустом"
Да тут это с самого начала.
Открытый программный проект свели к понятию "программа", полностью игнорируя пользовательскую аудиторию, распределённость процесса разработки, квалификацию разработчиков и протяженность всего процесса по времени. Причём в сообщении, из которого растёт тред, это всё упоминалось.
Можно приводить кучу разных ебанутых примерчиков и фич, но есть очень показательный момент: git - практически единственная открытая система распределённой разработки, которой сейчас можно пользоваться. Для меня это говорит о двух вещах. Во-первых, выбор языка был оправдан, так как он позволил привлечь в достаточной степени квалифицированных разработчиков. Во-вторых, у пишущих на C больше возможностей довести проект до ума (скорее всего потому, что "нормальные" плюсятники ваяют корпоративный софт под венду, а у остальных преимущественно каша в голове).

kokoc88

Во-первых, выбор языка был оправдан, так как он позволил привлечь в достаточной степени квалифицированных разработчиков.
Ну если ты сам ненавидишь какой-то язык, как ты сможешь сколотить команду профессиональных программистов на этом языке? Честно говоря, я не ожидал увидеть настолько откровенный нонсенс, где без аргументации пишут в духе "этот язык сосёт, потому что плохой, гадкий, любые решения на нём сосут, он заставляет делать програмы с плохой архитектурой". Он бы хоть пару примеров привёл. Типа буст у него не работает на какой-то платформе, или ещё что.
квалификацию разработчиков и протяженность всего процесса по времени. Причём в сообщении, из которого растёт тред, это всё упоминалось

Квалификацию разработчкиов на Си++ просто обосрали без аргументов. А протяжённость процесса по времени Линус не счёл нужным упомянуть. Впрочем, если обратиться к примеру кода, который я привёл выше, можно понять, что на просто букав на Си надо было написать раза в два больше, чем на Си++

Landstreicher

> Открытый программный проект свели к понятию "программа", полностью игнорируя пользовательскую
> аудиторию, распределённость процесса разработки, квалификацию разработчиков и протяженность
> всего процесса по времени. Причём в сообщении, из которого растёт тред, это всё упоминалось.
> пользоваться. Для меня это говорит о двух вещах. Во-первых, выбор языка был оправдан, так как он
> позволил привлечь в достаточной степени квалифицированных разработчиков. Во-вторых, у пишущих на
> C больше возможностей довести проект до ума (скорее всего потому, что "нормальные" плюсятники
> ваяют корпоративный софт под венду, а у остальных преимущественно каша в голове).
Т.е. основная причина выбора C — не техническая (преимущества или недостатки того или иного языка а социальная?

Landstreicher

> А расскажи про удобства Си++ по сравнению с Питон+Си? Питон для логики, Си для счета.
Еще раз предлагаю написать на каком-нибудь языке, отличном от C++, задачу из ICFPC.
Кстати, задача весьма интересная, того стоит.

Landstreicher

> "ааа, деструктор все сделает..."
> или напихают в деструкторы всякого барахла а потом мучаются с тем, что
> точка в которой он вызовется находится совсем не там где кажется
? не вижу никаких проблем с деструкторами.
Можно пример?

kruzer25

игры
где ещё счёт нужен?
Говорят, что производители игр сговорились с производителями железа. И тогда высокоуровневые языки дают сразу два преимущества - скорость разработки и не слишком высокая скорость работы.

oleg_n

> Т.е. основная причина выбора C — не техническая (преимущества или недостатки того или иного языка а социальная?
хорошо подмечено
технически всё оно эквивалентно машине тьюринга
технически С++ обратно совместим с С
твоё мнение, за что линус не любит С++?

kruzer25

З.Ы. пхп сосёт, пернартуру привет =)
Иди в жопу, если не считать мелкие косяки вроде foreach($arr as &$val) и отсутствие строгой типизации примитивных типов, в php не хватает только namespace-ов.

pilot

php не хватает только namespace-ов
Похоже, разработчики считают что в нем наоборот много лишнего

pilot

Т.е. основная причина выбора C — не техническая (преимущества или недостатки того или иного языка а социальная?
Ага. Не основная, но существенная.
У Пола Грэма, как всегда, есть статья на эту тему: Python paradox.

kruzer25

Сцылко не открываеццо, цитату можно?

Chupa

Честно говоря, я не ожидал увидеть настолько откровенный нонсенс, где без аргументации пишут в духе "этот язык сосёт, потому что плохой, гадкий, любые решения на нём сосут, он заставляет делать програмы с плохой архитектурой". Он бы хоть пару примеров привёл. Типа буст у него не работает на какой-то платформе, или ещё что.
Во-первых, такие проблемы ничего не покажут. Во-вторых, я уверен, что если бы у него возникла чисто техническая проблема, то он бы её решил. Мнение про плохую архитектуру образовалось не на пустом месте - это печальный опыт других проектов. Кстати, особенно печальным такой опыт оказывается именно в случае "а теперь выбросим сишный код и напишем правильно на плюсах". Утверждение излишне категорично, но не безосновательно.
Квалификацию разработчкиов на Си++ просто обосрали без аргументов.
Ну я совсем не отрицаю, что могут быть хорошие программисты на плюсах. Только язык намного более сложный, поэтому и выход годной продукции меньше (для open source проекта это серьёзный недостаток). В большинстве случаев это именно ламеры, гонящиеся за фичами под бессмысленными лозунгами типа "правильно", "круто" или "удобно", и которые совершенно не представляют, что со всем этим делать дальше (но явно это будут делать не они, т.к. завтра ветер подует в другую сторону). Гораздо эффективнее послать их всей толпой нахуй, чтоб не мешали, чем пытаться отфильтровывать разумные и одновременно правильные мысли от всего остального. А человек, который в нынешнее время пишет на сях, скорее всего знает, что и зачем он делает.
Кстати, категоричность сообщения вызвана во многом отшиванием очередного ламера. Нормальный разработчик (на любом языке) не стал бы пытаться изменить чужой проект под себя, если бы не собирался его развивать дальше, а от таких вот "улучшателей" гораздо больше вреда, чем пользы.
Кроме того, одно из предназначений открытого кода - фиксировать хорошие идеи (я думаю, что в случае с гит ставится и задача оставить след в истории). Чистый си для этого подходит гораздо лучше.

pilot

Все эти три языка эквивалентны с этой точки зрения.
"We were not out to win over the Lisp programmers; we were after the C++ programmers. We managed to drag a lot of them about halfway to Lisp."
- Guy Steele, Java spec co-author

kokoc88

В большинстве случаев это именно ламеры, гонящиеся за фичами под бессмысленными лозунгами типа "правильно", "круто" или "удобно", и которые совершенно не представляют, что со всем этим делать дальше (но явно это будут делать не они, т.к. завтра ветер подует в другую сторону). Гораздо эффективнее послать их всей толпой нахуй, чтоб не мешали, чем пытаться отфильтровывать разумные и одновременно правильные мысли от всего остального.
Ему надо было сразу написать про квалификацию глупых программистов. Я тоже низкого мнения о 99% опенсурса, причём не важно, на каком языке он написан. Не солидно трогать язык программирования, да ещё и в таком тоне, да ещё и без аргументации.

apl13

After that, the computer of the future will be called The Lisputer.
Б0ян.

psihodog

+1

psihodog

И в какой IDE можно по таким макросам ходить?
вроде же очевидно, что в сишном/сюпласпласном коде по макросам ИДЕ ходить легче, чем пофункциям?

psihodog

Т.е. основная причина выбора C — не техническая (преимущества или недостатки того или иного языка а социальная?
ну вот мне тоже так кажется, и тоже, кажется, что это не лишено смысла...
оградиться от всяких, которые научились писать на с++ по книжкам а ля "Борланд С++ 4.5".
а вообще, я тут около года назад писал одну програмку (задание по ЭВМ какое-то на мм одному челу) на чистом С.
Это пипец... Тяжело без с++ных удобств очень.

Werdna

boost::format
в пизду. есть snprintf. Мне больше ничего пока не понадобилось другого.

Vladislav177Rus

Скажи каке «нет!».

Werdna

Скажи каке «нет!».
Кака — это половина ебаного буст и потоки.

Werdna

Честно говоря, не очень понятно в чем суть претензий к C++. Много эмоций, но ни одного конкретного недостатка не указано.

Знаешь, я с опытом прихожу постепенно к осознанию, что местами все эти эмоции не беспочвенны. Не вдаваясь в подробности, я изложу чисто свой опыт.
резюме такое: на С++ всякий пидорас может написать такое, что потом проблем не огребешься.
Во-первых — страсть писать непонятно. Я бы увольнял всех, кто инклудит Лямбду. Жестко, только за 1 инклуд — этот человек уже неисправим, он будет писать для того, чтобы другие не понимали, а не для того, чтобы сделать рабочий проект. Сколько я видел перегруженных запятых и прочих палочек! Хорошо, если это boost::spirit, я допускаю возможность писать такое, но когда каждый пидорас делает подобное — код можно выбрасывать.
Во-вторых куча юношей фанатично начинают отказываться от _стандартных_ средств в пользу уёбищных (iostream'ам привет!). Не потому, что в этом есть необходимость перехода, а потому, что начинают рассуждать о гламуре как программисты Java (тупиковая ветвь эволюции). Вместо того, чтобы написать:

const char *name;
const char *email;
...
char buf[1024];
snprintf(buf, "Hello, %s! We sent you new password to %s email.", name, email);
std::string super_answer = buf;

Они обязательно напишут так:

const char *name;
const char *email;
...
std::string super_answer = "Hello, ";
super_answer += name;
super_answer += "! We sent you new password to ";
super_answer += email;
super_answer += " email."

Или ещё хуже — подключат что-то ужасное типа boost::format. В итоге такая простая простая вещь как, например, запись в логи превращается в совершенно неприемлемый код.
Это ещё пол беды, если бы они просто писали сложно, так обычно от этого страдает алгоритмистика — мозг переключается от вопроса "как сделать эффективный логгер в многопоточном приложении" к "какую палочку будем использовать для перегрузки такого-то оператора? всё ли в стиле?". В итоге потом делаю ХУДШЕЕ поделие — зато написано непонятно.
Но самое страшное, — это их желание сделать stl-based АПИ! Достаточно просто посмотреть на такую библиотеку как PoCo, и ты сразу поймёшь, что писали её просто больные люди. Нездоровые, и уже им, скорее всего, поможет только карательная психиатрия. Этот урод человеческой мысли (PoCo) говорит, в принципе, об уродливости языка, по крайней мере, о тенденции людей так писать.
Ко всему прочему стоит отметить, что программисты после такой практики просто оказываются не способны писать на чистом С, и — ВНИМАНИЕ — в упор не видят коренную необходимость делать это местами. Особо клинические случаи — это когда на предложение использовать expat вместо libxml тебе нагло говорят, что "у expat нет обёртки в PoCo. И вот тут уже убедить в том, что нужна производительность, а не ебанутая идеология — нереально.
Отмечу, что я не считаю плюсы плохим языком, но минимум половина программистов не получает в нужное время нужную прививку.

slonishka

агонь!

slonishka

ну, кстати, стрингстрим иногда полезен все-таки.
например, когда пользуешься строками, как сахаром и надо что-то быстро в одну из них прочитать.
не будешь же через буфер snprintf-ом фигачить.

kruzer25

Во-вторых куча юношей фанатично начинают отказываться от _стандартных_ средств в пользу уёбищных (iostream'ам привет!). Не потому, что в этом есть необходимость перехода, а потому, что начинают рассуждать о гламуре как программисты Java (тупиковая ветвь эволюции). Вместо того, чтобы написать
Это вообще жесть, и что они делать будут, когда формат поменять надо будет?
Так ни на каком языке писать не надо, при чём тут Java?

Werdna

Это вообще жесть, и что они делать будут, когда формат поменять надо будет?
Обычно такие вещи относятся к логам, а в логах формат если и менятеся, то там у тебя всё равно код дожен меняться.
Если нужен ответ по шаблону — использую шаблонизатор. Но использовать += пицсот рас — это клиника.

kruzer25

Тогда уж лучше использовать Debug::log('name',value чем все эти бесконечные +=.

kokoc88

В итоге такая простая простая вещь как, например, запись в логи превращается в совершенно неприемлемый код.

LogPrintTS(
LOG_LEVEL__RELEASE,
_T("GetCardInfo: Card details:%d,%d,%d,%d,%d,%d,%I64d,%s,%d,%d,%s,%I64d\r\n"
static_cast<int>(pCardInfo->btWasDeleted
static_cast<int>(pCardInfo->btRevoke
static_cast<int>(pCardInfo->btExpired
static_cast<int>(pCardInfo->btNotActive
static_cast<int>(pCardInfo->btAuthRequired
static_cast<int>(pCardInfo->wDiscountNumber
pCardInfo->nFullSum,
pCardInfo->szName,
static_cast<int>(pCardInfo->wBonusNumber
static_cast<int>(pCardInfo->btBlocked
pCardInfo->szBlockReason,
pCardInfo->nDiscountSumMax
);
 LOG(Log::DBG) << L"GetCardInfo: Card details: " << pCardInfo;
Если кто-то не может правильно использовать iostreams, то это вовсе не повод превращать логирование в потенциально опасный механизм в программе. В sprintf слишком просто где-то перепутать типы, потерять варнинг и получить segmentation fault в том месте программы, которое спокойно пропустят тестеры.
Глупо кричать о том, что какой-то механизм является гавном, если либо сам не умеешь его нормально использовать, либо редко встречал тех, кто нормально его использует.

kruzer25

Глупо кричать о том, что какой-то механизм является гавном, если либо сам не умеешь его нормально использовать, либо редко встречал тех, кто нормально его использует.
Речь как раз о том, что очень редко встречаются те, кто этот механизм нормально используют, а значит, легче уж вообще не рассматривать тех, кто таким механизмом пользуется, чем пытаться определить, правильно они им пользуются, или неправильно

kokoc88

Речь как раз о том, что очень редко встречаются те, кто этот механизм нормально используют, а значит, легче уж вообще не рассматривать тех, кто таким механизмом пользуется, чем пытаться определить, правильно они им пользуются, или неправильно
Да это-то понятно. Просто я предпочитаю обобщать подобные вещи в другую сторону. Мне почему-то кажется, что чаще всего кричат те, кто сам не понимает, как правильно пользоваться какими-то конструкциями.

salora

Инструмент должен быть удобным и безопасным. Точно так, можно какой-нибудь станок делать открытым, передачами наружу и т.п., а потом говорить, что станочник сам лох, если ему руку отрежет

Werdna

Да пишите вы всякую хуйню сколько хотите, я что — нанимался тут кого-то переубеждать?

Werdna

Инструмент должен быть удобным и безопасным.
snprintf удобен и безопасен.
вот пример как я использую лог:

message(MSG_DEBUG, "test vat = %d", my_var);

Кто-то и асерты использует, и тоже считает, что это нормально. Виндузятники так поголовно их используют.

ppplva

Опа. А ассерты-то тебе чем не нравятся ?

Werdna

Недопустимо пользоваться макросом assert.
Хорошая программа – это программа, работающая в отладочной конфигурации под номинальной нагрузкой. Макрос assert, при использовании отладочной конфигурации, изменяет поведение программы. Проще говоря, программа упадет не там, где ошибка действительно могла бы проявиться, и где она будет проявляться в рабочем режиме, а на указанном макросе. Соответственно, поскольку заранее всего предусмотреть невозможно, есть вероятность получить две совершенно разные программы и долго искать ошибку в несуществующем месте.

ppplva

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

klyv

Интересно, кто же нас призывает не юзать удобства отладки с assert'ом?

Werdna

Какой феерический бред.
Это опыт.
Асерты приводят к тому, что когда их убираешь, прога начинает работать ПО-ДРУГОМУ. Отладка не должна менять логику работы приграммы.

Ivan8209


#define CONCAT(x, y) {(x) = realloc(length(x) + length(y) + 1); (x) = strcat(x, y);}

Прочитай, почему в NetBSD пишут так:

#define DOIT(...) do { ... } while(/*CONSTCOND*/0)

а не как у тебя.
---
...Я работаю антинаучным аферистом...

Ivan8209

> snprintf(buf, "Hello, %s! We sent you new password to %s email.", name, email);
Ты же у нас за скорость, если я правильно помню?
Тогда почему ты делаешь snprintf+write, а не writev?
Или что-нибудь более правильное на основе strlcat/strlcpy.
Может быть, лучшим способом было бы использовать готовую БД,
а не перекодировать, как только формат поменялся?
---
...Я работаю антинаучным аферистом...

Ivan8209

> А Хаскель, Лисп и Окамл — это игрушки, серьезной софтины не напишешь.
> Сами с Лиспом мучаемся.
(Я бы сказал, что вы больше мучитесь не с лиспом, а с
организационными вопросами, далёкими от программирования.)
Большая беда CL, на мой взгляд, заключается в отсутствии
хороших переносимых компиляторов. Нет ничего уровня сталина или
цыплёнка, чтобы получать промежуточный сишный код, который ещё
можно попытаться заставить работать на "серьёзных" платформах,
для которых компиляторов CL нет и не ожидается, потому что
компиляторописатели ещё не убрали ту жесть, которая находится в
недрах CMUCL и SBCL, наверное, с середины прошлого десятилетия.
---
...Я работаю антинаучным аферистом...

Ivan8209

> И я так понимаю, в сем языке макросы такие, что дай Бог каждому!
Я бы взял средства отладки, а насчёт макросов ещё бы разок подумал.
---
...Я работаю антинаучным аферистом...

apl13

Ишь ты!
Маза, я до такого еще не доходил в своих макросах.

Ivan8209

> А функции, которые возвращают значения, а в случае ошибок
> выкидывают исключения, чтобы не проверять код возврата на
> каждой второй строке?
Это беда не языка, а стандартной библиотеки и связанным с ней
способом мышления, исключения в сях можно успешно кидать и
ловить, там даже продолжения замутить можно.
---
"Расширь своё сознание!"

ppplva

Естественно она работает по-другому. Кстати, с -O3 и -O0 программы тоже частенько работают по -разному. Просто любой инструмент нужно использовать с головой, и все будет в порядке, и изменения в поведении будут вполне предсказуемыми и позитивными.

Ivan8209

Никогда не писал "if(ok) DOIT; else BAILOUT;"? Заметно.
---
...Я работаю антинаучным аферистом...

apl13

Кстати, с -O3 и -O0 программы тоже частенько работают по -разному.
Бугаго. Не могу придумать, почему бы при этом аптимезаторам не убить себя апстенку.

apl13

Ну да.
Если честно, я всегда пишу:
if(OK) {

Ivan8209

Я бы сказал, что с -O3 программы частенько не работают,
в отличие от -O0.
---
...Я работаю антинаучным аферистом...

ppplva

Бывает и так. Вот прямо сейчас я смотрю на одну из них, и что-то мне влом в ней разбираться ) Сегфолт только на x86_64 и только с -O3.

kokoc88

Это беда не языка, а стандартной библиотеки и связанным с ней
способом мышления, исключения в сях можно успешно кидать и
ловить, там даже продолжения замутить можно.
Ага, только ты заебёшься это всё делать. Сам же когда-то кричал про "ручную работу". Так вот зачем я буду что-то делать на Си, если в Си++ это уже есть?

Ivan8209

Ну, если честно, то это такой грязный хак, чтобы обойти грязные
хаки в синтаксисе языка си и в семантике сишного препроцессора.
Заворачивать каждый оператор в процедурные скобки, когда этого
можно не делать, это, по-моему, загромождение записи.
У меня "if (ok) doit" и "if (ok) (doit)" имеют разный смысл.
---
...Я работаю антинаучным аферистом...

Ivan8209

При отсутствии стандартной библиотеки, это всё равно придётся
делать руками, так что можно написать свою собственную.
А при наличии готовой библиотеки, это не нужно будет делать руками.
---
...Я работаю антинаучным аферистом...

Ivan8209

Кстати, а ты не сталкивался с тем, что на некоторых программах
гнусь вешается при -O2 и -O3 даже на i386?
---
...Я работаю антинаучным аферистом...

pilot

(Я бы сказал, что вы больше мучитесь не с лиспом, а с
организационными вопросами, далёкими от программирования.)

С чем только не мучаемся
Ну не будем переходить на личности, про таланты которых нам тоже есть что сказать.
Большая беда CL, на мой взгляд, заключается в отсутствии
хороших переносимых компиляторов. Нет ничего уровня сталина или
цыплёнка, чтобы получать промежуточный сишный код, который ещё
можно попытаться заставить работать на "серьёзных" платформах,
для которых компиляторов CL нет и не ожидается, потому что
компиляторописатели ещё не убрали ту жесть, которая находится в
недрах CMUCL и SBCL, наверное, с середины прошлого десятилетия.

Полный бред.
Главная беда в отсутствии хороших библиотек и маленьком community.

Ivan8209

Просто к сведению, при ASSERT ядро падает в отладчик, причём
после такого падения иногда не получается сохранить дамп,
без ASSERT, всё продолжает работать как ни в чём не бывало,
за исключением выполнения полезной работы.
---
"Крепче держите попкорн, граждане, плохо ваше дело;
ща вылезет --- устроит всем полный Армагеддец!"

apl13

Заворачивать каждый оператор в процедурные скобки, когда этого
можно не делать, это, по-моему, загромождение записи.
Это я когда-то прочитал статью о безопасном стиле программирования. Там был американский аргумент о том, что к
if(condition)
operator1;

кто-нибудь может ненароком приписать, и получится:
if(condition)
operator1;
operator2;
, а фигурные скобки спасут от недоразумения.

kruzer25

if(condition)
operator1;
Да, кто-нибудь может ненароком приписать, поэтому тут не нужен перевод строки.

smit1

>Да, кто-нибудь может ненароком приписать, поэтому тут не нужен перевод строки.
Тогда на внутренность if'а брек-пойнт в отладчике халявно не поставишь
А вообще, я так понимаю, фишка с ду-вайлом нужна, чтобы после "вызова" макроса можно было точку с запятой ставить (?) Так что фигурные скобки у ифов вроде тут ни при чём.

Ivan8209

> Главная беда в отсутствии хороших библиотек и маленьком community.
Я не заметил, чтобы сообщество было таким уж маленьким,
сравнимо с PHP и PERL, стабильно выше, чем у TCL.
Если учесть, что большая часть перловых библиотек занимается
тем, что реализует внутренние средства CL, я бы сказал про
примерное равенство.
---
...Я работаю антинаучным аферистом...

kokoc88

При отсутствии стандартной библиотеки, это всё равно придётся
делать руками, так что можно написать свою собственную.
Что придётся делать руками? В Си++ можно кидать исключения и всё будет в порядке. Ничего руками делать не надо. В Си тебе как минимум придётся следить за всеми ресурсами, создавать искусственный стек и так далее. Код разбухнет до предела. Тут нечего даже сравнивать.

Ivan8209

> А вообще, я так понимаю, фишка с ду-вайлом нужна, чтобы после
> "вызова" макроса можно было точку с запятой ставить (?)
Ставить ты можешь как угодно, вопрос в том, чтобы эта расстановка
была согласована с правилами языка.
> Так что фигурные скобки у ифов вроде тут ни при чём.
На самом деле, "при чём." Это и есть проблемное место, которое
закрывает "do ... while(0)", если ты оборачиваешь каждый оператор
в скобки, то ты всегда получаешь "} else" и никак не можешь получить
"}; else".
---
...Я работаю антинаучным аферистом...

Ivan8209

> В Си тебе как минимум придётся следить за всеми ресурсами
За ними так и так придётся следить, но разговор не об этом,
а о том, чтобы следить структурированно, а не пробрасывать
флаги по уровням вложенности или вызывать специальные
продолжения, завершающиеся _exit.
> Код разбухнет до предела.
Не так уж он и сильно разбухает, это не флаги пробрасывать.
Зато ты получаешь чётко определённую семантику, где и что
у тебя освобождается, без запоминания правил неявного вызова
деструкторов.
И, кстати, почему-то лиспники всё равно явным образом используют
обёртки, пробрасывающие исключения, а не деструкторы объектов,
связанных с тем же вводом-выводом.
---
...Я работаю антинаучным аферистом...

Ivan8209

> Вот ищешь ты баг в огромной программе, и натыкаешься на
> использование функции concat. Такой стандартной функции нет.
> Где искать её определение - хз.
Умные люди используют TAGS.
> Что она делает - хз.
И комментируют код, если он неочевиден.
> Твой concat - это ещё хорошо, там определение короткое,
> а если там кода на несколько килобайт?
> Как в них искать синтаксическую ошибку?
Но макросы такими длинными пишут только, наверное, лиспники.
Вроде , только там и макросы немного другие, и
синтаксические ошибки сделать сложно. Вот семантические ---
другое дело. Но такие можно и на STL накрутить, как правильно
заметил "великий и мудрый LT".
---
...Я работаю антинаучным аферистом...

pitrik2

маленьким
странная статистика по ссылке
нету с#
они хотят сказать что он совсем не популярен?

kokoc88

> В Си тебе как минимум придётся следить за всеми ресурсами
За ними так и так придётся следить, но разговор не об этом,
Разговор как раз об этом. В Си++ у тебя чётко определены правила вызова деструктора. Поэтому ни за чем там следить не надо. Приведи пример кода на Си, который должен кидать исключения твоим способом :
void f
{
FILE* pf = fopen("test", "r");
char* buf = (char*) malloc(1024);
struct S* pS = (struct S*) malloc(sizeof(struct S;
/* do some work*/
/* throw exception here */
}

Зато ты получаешь чётко определённую семантику, где и что
у тебя освобождается, без запоминания правил неявного вызова
деструкторов.
Правила вызова деструкторов запомнить проще, чем от проекта к проекту запоминать семантику, где и что освобождается. Да ещё при этом придётся не забывать это всё освобождать руками или регистрировать в хранилище своей библиотеки, опять же руками.

kruzer25

И комментируют код, если он неочевиден.
...и комментируют каждое упоминание макроса concat.
Нахуй-нахуй, это к каждой строчке коммнентарий писать придётся.

pilot

> Я не заметил, чтобы сообщество было таким уж маленьким
Это потому что ты не занимаешься разработкой на Лиспе профессионально.
> внутренние средства CL
regexp, XML, графика - внутренние средства CL? Покажи их в документации?

salora

Пора признать, что C - не для прикладного программирования
Впрочем, и C++ тоже не слишком для него удобен.

pilot

...и комментируют каждое упоминание макроса concat.
PHPшник :-)
Use Google и найди Slime.

danilov

Вот, чем не люблю холивары, так это тем, что добрая половина (а то и больше) ведут себя как
покемон Горохуй... А казалось бы, МГУ...

Ivan8209

> regexp, XML, графика - внутренние средства CL?
Всё, за исключением РВ, и в питоне, и в перле, и в пхп, и в
тикле отсутствует, оно присутствует там на тех же правах, на
которых и в КЛ.
---
...Я работаю антинаучным аферистом...

Ivan8209

> Пора признать, что C - не для прикладного программирования
Предложишь альтернативу?
Заодно сообщи, что именно ты считаешь прикладным программированием.
---
...Я работаю антинаучным аферистом...

pilot

Y
То что ты не знаешь кто такой Пол Грэм говорит только о недостатке твоего образования.
Не так много известных хороших программеров на свете есть.
То что ты не следишь за IT — твоя проблема.
Но семечки у тебя ничего.
Имхо, надо бы завести тред "Что вы читаете по теме?".

pilot

Всё, за исключением РВ, и в питоне, и в перле, и в пхп, и в
тикле отсутствует, оно присутствует там на тех же правах, на
которых и в КЛ.
Объясняю:
1. Указание на Перл — бред.
2. Библиотеки CL глюкавые все как одна (и regexp потому что их никто кроме разработчиков никогда не пользовал.

danilov

Это не было ответом тебе... И даже на пост...
Это был просто последний пост на первой странице (у меня по 40).
И зря ты обижаешься... Большая часть здесь действительно не
пытаются что-то кому-то объяснить

Ivan8209

> /* throw exception here */
Вместо этого пишешь "longjmp(handler, -1);", и ты оказываешься
в другом месте. Причём точно знаешь, что у тебя семантика всегда
"retry", о чём уже можно не заботиться.
Да, организовывать вложения тоже придётся руками или макросом,
но это уже совсем другая история.
> Правила вызова деструкторов запомнить проще, чем от проекта
> к проекту запоминать семантику, где и что освобождается.
Вообще говоря, это не правила проекта, оно ближе к стилю.
Примерно так же, как ты можешь вызывать perror/exit или warn/err,
но всё равно проверять, что тебе вернул malloc или open.
Да, си предлагает чересчур простую библиотеку и не навязывает
правил обработки ошибок, однако это не означает, что
единственным способом является пробрасывание флага.
Вообще говоря, различие лежит глубже: есть две модели обработки
событий, опрос и ожидание. Обе имеют право на существование,
просто с ними надо по-разному работать. Я думаю, если бы тебя
учили не последовательному программированию, а ситуационному,
тебе бы и в голову не пришло, что бывают какие-то "исключения",
ты бы просто переходил к точно такому же невыделенному среди
остальных состоянию, где решал бы, что делать, когда не хватило
памяти.
---
...Я работаю антинаучным аферистом...

Ivan8209

> 1. Указание на Перл — бред.
Может, ты тогда объявишь, какие графические средства _встроены_ в перл?
То же с XML.
> 2. Библиотеки CL глюкавые все как одна (и regexp
CFFI не спасает? Только не говори, что под LW его нет, я не поверю.
Помимо того, очень многие библиотеки живые, CL лет ещё меньше, чем BSD.
> потому что их никто кроме разработчиков никогда не пользовал.
Это, мягко говоря, неправда.
---
...Я работаю антинаучным аферистом...

kokoc88

Вместо этого пишешь "longjmp(handler, -1);", и ты оказываешься
в другом месте. Причём точно знаешь, что у тебя семантика всегда
"retry", о чём уже можно не заботиться.
Договаривай: я оказываюсь в другом месте с тремя утечками.

Ivan8209

> Договаривай: я оказываюсь в другом месте с тремя утечками.
Если ты соблюдаешь правила вложения, никаких утечек нет.
---
...Я работаю антинаучным аферистом...

salora

Началось. Бедняга токарь

kokoc88

Если ты соблюдаешь правила вложения, никаких утечек нет.
Так ты приведи хотя бы часть кода, где ты следишь за этими правилами. (Кстати, Си++ следит за деструкторами сам.) Очевидно, код распухнет по сравнению с Си++, и намного.

kokoc88

Началось. Бедняга токарь
Я только до сих пор не могу понять, на кой чёрт ты ответил на мой пост. Или ты тоже считаешь, что sprintf безопаснее ostream?

pilot

Я не собираюсь с тобой спорить.
Научись прогать на Лиспе и попробуй написать качественный коммерческий софт. И сам убедишься.
>Может, ты тогда объявишь, какие графические средства _встроены_ в перл?
>То же с XML.
Перечитай посты, ты не о том.
> CFFI не спасает? Только не говори, что под LW его нет, я не поверю.
Не спасает, он убог.
> Помимо того, очень многие библиотеки живые, CL лет ещё меньше, чем BSD.
Гуманитарий? На "большинство глюкавые" контрпример "есть неглюкавые"? Зачем мне неглюкавые которые не делают того что мне нужно?
> Это, мягко говоря, неправда.
Иди регекспы потестируй. которые "быстрее сишных"

Ivan8209

Ты про POLA что-нибудь слышал?
Если ты привык к императивному стилю, то у тебя есть одни привычки,
если ты привык к какому-то другому, другие. Если ты не привык ни
к чему, то у тебя вообще никаких привычек нет, и в этому случае
единственный способ обучения --- дисциплина. В программировании
часто не видно, что хорошо, а что плохо, поэтому некоторые любят
принцип "crash early, crash badly." Это же и использует неявно
Торвальдс: у неприплюснутого насильника больше горького опыта,
что важнее в больших и ядерных проектах.
Кстати, пример.
Если ты привык к тому, что память надо запирать, а то уползти может,
как в MacOS Classic или Palm, то программировать под униксы становится
страшновато, потому что там "mandatory locks" нет и хрен ты что с этим
сделаешь. Униксоиды этого могут не видеть и, вообще говоря, не видят,
пока не сталкиваются с похожими проблемами на примере pthreads.
В красках.
---
...Я работаю антинаучным аферистом...

salora

С простыми утилитами типа "получил из стдина, отдал в стдаут" проблем быть не может, не спорю. А если надо создавать здоровую систему, которая должна работать 7 дней в неделю, 24 часа в сутки, то такой подход не проходит.

Ivan8209

>> Может, ты тогда объявишь, какие графические средства _встроены_ в перл?
>> То же с XML.
> Перечитай посты, ты не о том.
Я о том, что пока КЛ уступает перлу больше из-за компилятора,
чем из-за библиотек. Ты привёл примеры именно к этому.
>> CFFI не спасает? Только не говори, что под LW его нет, я не поверю.
> Не спасает, он убог.
Ну, возьми другой FFI, какой тебе больше нравится.
>> Помимо того, очень многие библиотеки живые, CL лет ещё меньше, чем BSD.
> Гуманитарий?
Да.
> На "большинство глюкавые" контрпример "есть неглюкавые"?
> Зачем мне неглюкавые которые не делают того что мне нужно?
Ты используешь одни и те же библиотеки что в лиспе, что в перле,
может, конечно, Expat на перл переписали, но что-то не верится.
Что ещё? Motif? GTK? Они тоже одни что для перла, что для лиспа.
>> Это, мягко говоря, неправда.
> Иди регекспы потестируй. которые "быстрее сишных"
Я использую штатные спенсеровы через FFI. Мне так проще.
---
...Я работаю антинаучным аферистом...

Ivan8209

Там и с плюсами те же проблемы, в которых тонут различия
в стилях обработки ошибок.
---
...Я работаю антинаучным аферистом...

sbs-66

Пипец у тебя претензии. А как ты будешь выводить массив данных в формате [a_0, a_1, ..., a_n], в смысле через запятые. Тоже с sprintf извращаться? Вот почему-то во всех нормальных языках конкатенация строк делается через +, а в С++ мы должны извращаться c C-like sprintf. Так и говори, что ты С++ пользоваться не умеешь, а мама научила только на С писать.
А претензии к assert - вообще шик. Используешь ты какую-нибудь билиотеку, которая говорит, что должна что-то такое вернуть (ну, например, два параллельных массива одинаковой длины). Параллельные массивы, конечно, плохо, но речь не о том. Ты что будешь делать, если она вернёт что-то не то? Ждать пока у тебя програма 10 раз данные сохранит и считает, а потом упадёт в неизвестном месте, и ты заебёшься отлаживаться, чтобы понять почему, или сразу напишешь assert на то, что данные корректны?
То, что пользовательская и девеловерская версия программы должны работать одинаково (разве что отладчные логи у пользователя можно не выводить) - это конечно да, но что assert не использовать - это глупость. Если у тебя assert в пользовательской версии делает не то, что в девелоперовоской, так это тебе его переопределить просто надо.

Werdna

А как ты будешь выводить массив данных в формате [a_0, a_1, ..., a_n], в смысле через запятые. Тоже с извращаться?

sNprintf, так как sprintf не безопасен.
Я буду в цикле делать offset += snprintf(buf + offset, BUF_SZ - offset, "%d, ", mas[i]);
И это правильно. Потому что работает пиздец как быстро.

Werdna

Используешь ты какую-нибудь билиотеку, которая говорит, что должна что-то такое вернуть (ну, например, два параллельных массива одинаковой длины). Параллельные массивы, конечно, плохо, но речь не о том. Ты что будешь делать, если она вернёт что-то не то?
Во-первых, я не использую "какие-то" библиотеки, ибо пользуюсь правилом — "или используй проверенное другими, или пиши сам с нуля". Пока из "каких-то" библиотек мне приходилось попдесть только на одну — лемматизатор Сокирко, но даже его мы переписали с нуля. Ну а если уж совсем никак и НАДО... я не понял в чем вопрос?

sbs-66

Да хоть даже и сами написали. Просто внешняя по отношению к данной библиотека, код которой компилируется отдельно, соответсвенно, гарантировать, что она будет возвращать то, что ты от неё ожидаешь, ты не можешь - другой программист может изменить код. И как ты предлагаешь, не пользуясь assert, проверять корректность данных, возвращаемых этой внешней библиотектой? Нормальные люди пишут в этом месте assert (вернее во всех местах, где надо проверить целостность каких-то внутренних инвариантов, которые не отслеживаются автоматически средствами языка и живут спокойно - если программа начнёт себя вести не так, как мы ожидаем, то полетит ислючение, которое мы обработаем на верхнем уровне и выдадим сообщение об ошибке. Таким образом большинство ошибок будет замеченно на этапе тестирования. А если какая-то ошибка случиться у пользователя, то мы будем иметь не спупое сообщение об обращении к чужой памяти по непонятному адресу (+ крэш программы а информацию о том, в каком месте кода она случилась (+ программа продолжит работать, если ошибка не в критическом месте что в большинстве случаев уже достаточно, чтобы понять, что случилось.

sbs-66

Охренеть понятный код, да.
А почему во всех современных языках пишут что-то вроде?
result += ", " + a[i].to_str
А нормальная реализация строк на C++ позволяет писать так же, и при этом не проигрывать твоему коду по скорости?

slonishka

ты чего сердитый такой? там же ни слова про понятность не было.

sbs-66

А это кто писал тогда?
Во-первых — страсть писать непонятно. <бла-бла-бла>
Во-вторых куча юношей фанатично начинают отказываться от _стандартных_ средств в пользу уёбищных (iostream'ам привет!). <бла-бла-бла, надо юзать c-like snprintf>

slonishka

ну это хз =)

feliks28

и никак не можешь получить "}; else".
А оно зачем?
Оставить комментарий
Имя или ник:
Комментарий: