У C есть главное преимущество в том, что вы можете просто увидеть, что происходит на самом деле, когда вы смотрите на какой-то фрагмент кода (да, препроцессор: скомпилируйте с -E, а затем вы это увидите). То, что слишком часто не соответствует действительности, если вы посмотрите на код C ++. Там у вас есть конструкторы и деструкторы, которые вызываются неявно на основе области видимости или из-за присваиваний, у вас есть перегрузка оператора, которая может иметь удивительное поведение, даже если оно не используется неправильно. Признаюсь, я помешан на контроле, но пришел к выводу, что это не такая уж плохая привычка для разработчика программного обеспечения, который хочет писать надежное программное обеспечение. Я просто хочу иметь шанс сказать, что мое программное обеспечение делает именно то, что должно делать, и в то же время не вызывает неприятных ощущений в животе, потому что я знаю, что в нем все еще может быть так много ошибок, что я бы не стал ''
В C ++ также есть шаблоны. Я ненавижу и люблю их, но если кто-то говорит, что полностью понимает их, я называю его / ее лжецом! Это включает в себя составителей компилятора, а также людей, участвующих в определении стандарта (что становится очевидным, когда вы пытаетесь его прочитать). Существует так много абсурдно вводящих в заблуждение угловых случаев, что просто невозможно рассмотреть их все, пока вы пишете реальный код. Мне нравятся шаблоны C ++ за их мощь. Действительно удивительно, что вы можете с ними сделать, но они также могут привести к самым странным и трудным для поиска ошибкам, которые только можно (не) вообразить. И эти ошибки действительно случаются и даже не редко. Чтение о правилах, используемых для разрешения шаблонов в C ++ ARM, чуть не взорвало мою голову. И это вызывает у меня неприятное чувство потраченного впустую времени на чтение сообщений об ошибках компилятора длиной в несколько 1000 символов, для которых мне нужно уже 10 минут или больше, чтобы понять, что компилятор действительно хочет от меня. В типичном коде C ++ (библиотеки) вы также часто находите много кода в файлах заголовков, чтобы сделать определенные шаблоны возможными, что, в свою очередь, делает циклы компиляции / выполнения мучительно медленными даже на быстрых машинах и требует перекомпиляции больших частей кода, когда вы что-то меняете. там.
В C ++ также есть ловушка const. Вы либо избегаете const для всех случаев, кроме самых тривиальных, либо рано или поздно вам придется отбросить его, либо рефакторинг больших частей кодовой базы, когда она будет развиваться, особенно когда вы собираетесь разработать красивый и гибкий объектно-ориентированный дизайн.
В C ++ более строгая типизация, чем в C, и это здорово, но иногда мне кажется, что я кормлю тамагочи, когда пытаюсь скомпилировать код C ++. Большая часть предупреждений и ошибок, которые я обычно получаю от этого, на самом деле связаны не с тем, что я делаю что-то, что не сработает, а просто с вещами, которые компилятор не хочет, чтобы я делал так или нет без преобразования или добавления здесь дополнительных ключевых слов и там.
Это лишь некоторые из причин, по которым мне не нравится C ++ для программного обеспечения, которое я пишу самостоятельно, только с использованием некоторых предположительно надежных внешних библиотек. Настоящий ужас начинается, когда вы пишете код в команде с другими людьми. Практически не имеет значения, являются ли они очень умными хакерами C ++ или наивными новичками. Ошибки совершают все, но в C ++ их намеренно трудно найти, а еще труднее обнаружить до того, как они произойдут.
С C ++ вы просто теряетесь, не используя отладчик все время, но мне нравится иметь возможность проверять правильность моего кода в моей голове и не полагаться на отладчик, чтобы найти мой код, работающий по путям, которые я никогда не ожидал. На самом деле я пытаюсь запустить весь свой код в голове и попытаться взять все его ветки, даже в подпрограммах и т. Д., И использовать отладчик только изредка, просто чтобы посмотреть, насколько хорошо он проходит через все уютные места, которые я для него приготовил. Написание и выполнение такого количества тестовых примеров, что все пути кода использовались во всех комбинациях со всевозможными странными входными данными, просто невозможно. Таким образом, вы можете не знать об ошибках в программах на C ++, но это не значит, что их там нет. Чем крупнее становится проект C ++, тем меньше становится моя уверенность в том, что в нем не будет большого количества необнаруженных ошибок, даже если он отлично работает со всеми имеющимися у нас тестовыми данными. В конце концов, я выбрасываю его и начинаю заново с другого языка или комбинации других языков.
Я мог бы продолжить, но, полагаю, к настоящему времени я ясно изложил свою точку зрения. Все это заставило меня чувствовать себя непродуктивным, когда я программирую на C ++, и заставило меня потерять уверенность в правильности моего собственного кода, что означает, что я больше не буду его использовать, хотя я все еще использую и полагаюсь на код C, который я написал более 20 много лет назад. Может быть, это просто потому, что я не очень хороший программист на C ++, или, может быть, хорошее знание C и других языков позволяет мне понять, какой я ламер на самом деле, когда дело касается C ++, и что я никогда не смогу полностью это понять. ,
Жизнь коротка...