﻿# 50 вредных советов для С\+\+ программиста

Какую статью по C\+\+ ни возьми, она серьёзна и требует вдумчивого чтения, желательно с кофе\. А развлечься тоже хочется\. Для этого и написана эта шуточная статья с вредными советами по программированию\. Главное – не перепутайте с полезными\!

![0953_50_terrible_tips_ru/image1.png](https://import.viva64.com/docx/blog/0953_50_terrible_tips_ru/image1.png)

Я пишу [статьи](https://pvs-studio.ru/ru/blog/posts/?author=andrey-karpov), посвящённые созданию качественного кода и методологии статического анализа\. Но хочется пошалить\. Так и появилась эта статья с 50 антисоветами\. Впрочем, если в комментариях читатели напишут ещё рекомендаций по созданию говнокода, то есть шанс, что выйдет новая статья, начинающаяся с числа 100 :\)\.


> Предлагаем познакомиться с расширенной версией статьи: "\[60 антипаттернов для С\\\+\\\+ программиста\]\(https://pvs\-studio\.ru/ru/blog/posts/cpp/1053/\)"\\\. В ней не только больше советов, но и есть пояснение по каждому из них\\\.



Если вдруг не совсем понятно, почему какой\-то совет вредный, то перейдите по \{ссылочке\}\. Ссылка отсутствует? Дайте знать, пополню пояснения\.

1. Настоящие программисты программируют только на C\+\+\! \{[1](https://pvs-studio.ru/ru/blog/posts/cpp/0939/#BadAdviceExplanationN1)\}
1. Если в [строковом литерале](https://en.wikipedia.org/wiki/Literal_(computer_programming)) вам нужен символ табуляции, смело жмите кнопку tab\. Оставьте \\t для яйцеголовых\. Не парьтесь\.
1. Всюду используйте вложенные макросы\. Так текст программы станет короче, и вы сохраните больше места на жёстком диске\. Заодно это развлечёт ваших коллег при отладке\. \{[3](https://habr.com/ru/companies/pvs-studio/articles/444612/)\}
1. Отключите предупреждения компилятора\. Они отвлекают от работы и мешают писать компактный код\.
1. Используйте для переменных имена из одной\-двух букв\. Так в одну строчку, помещающуюся на экране, можно уместить более сложное выражение\.
1. Используйте числа в программировании\. Так ваша программа будет выглядеть умнее и солиднее\. Согласитесь, что такие строки смотрятся хардкорно: _qw \= ty / 65 \- 29 \* s_; \{[6](https://pvs-studio.ru/ru/blog/posts/cpp/0939/#BadAdviceExplanationN6)\}
1. Используйте при написании кода [невидимые символы](https://pvs-studio.ru/ru/docs/warnings/v1076/)\. Пусть ваш код работает магическим образом\. Это прикольно\.
1. Во всех старых книгах для хранения размеров массивов и для организации циклов использовались переменные типа _int_\. Так и делайте\. Не стоит нарушать традиции\. \{[8](https://pvs-studio.ru/ru/blog/posts/cpp/0939/#BadAdviceExplanationN8)\}
1. Глобальные переменные очень удобны, т\.к\. к ним можно обращаться отовсюду\.
1. Совет для разработчиков библиотек: в любой непонятной ситуации сразу завершай программу, используя функцию _abort_ или _terminate_\. \{[10](https://pvs-studio.ru/ru/blog/posts/cpp/0939/#BadAdviceExplanationN10)\}
1. Если что\-то не работает, то, скорее всего, глючит компилятор\. Попробуйте поменять местами некоторые переменные и строки кода\. \{[11](https://pvs-studio.ru/ru/blog/posts/cpp/0939/#BadAdviceExplanationN11)\}
1. Не мешкайте и не тормозите\. Сразу берите и используйте аргументы командной строки\. Например, так: _char buf\[100\]; strcpy\(buf, argv\[1\]\);_\. Проверки делают только параноики, неуверенные в себе и в людях\. \{[12](https://pvs-studio.ru/ru/blog/posts/cpp/0939/#BadAdviceExplanationN12)\}
1. Undefined behavior – это страшилка на ночь для детей\. На самом деле его не существует\. Если программа работает, как вы ожидали, значит она правильная\. И обсуждать здесь нечего, точка\. \{[13](https://pvs-studio.ru/ru/blog/posts/cpp/0939/#BadAdviceExplanationN13)\}
1. Смело сравнивайте числа с плавающей точкой с помощью оператора \=\=\. Раз есть такой оператор, значит им нужно пользоваться\. \{[14](https://pvs-studio.ru/ru/docs/warnings/v550/)\}
1. _memmove_ — лишняя функция\. Всегда и везде используйте _memcpy_\. \{[15](https://pvs-studio.ru/ru/blog/posts/cpp/0939/#BadAdviceExplanationN15)\}
1. Размер указателя и _int_ — это всегда 4 байта\. Смело используйте это число\. Число 4 смотрится намного изящнее, чем корявое выражение с оператором _sizeof_\. \{[16](https://pvs-studio.ru/ru/blog/posts/cpp/0939/#BadAdviceExplanationN16)\}
1. Нет смысла проверять, удалось ли выделить память\. На современных компьютерах её много\. А если не хватило, то и незачем дальше работать\. Пусть программа упадёт\. Всё равно уже больше ничего сделать нельзя\. \{[17](https://pvs-studio.ru/ru/blog/posts/cpp/0939/#BadAdviceExplanationN17)\}
1. Добавляйте разные вспомогательные функции и классы в пространства имён _std_\. Ведь для тебя эти функции и классы стандартные и базовые, а раз так, им самое место в _std_\. \{[18](https://pvs-studio.ru/ru/docs/warnings/v1061/)\}
1. Коллеги должны знать о вашем богатом опыте с языком C\. Не стесняйтесь демонстрировать им в вашем C\+\+ проекте свои умелые навыки ручного управления памятью и _longjmp_\.
1. Используйте как можно меньше фигурных скобок и переносов строк, старайтесь писать условные конструкции в одну строку\. Так код будет быстрее компилироваться и занимать меньше места\. \{[20](https://pvs-studio.ru/ru/blog/posts/cpp/0939/#BadAdviceExplanationN20)\}
1. Никогда не тестируйте\. И не пишите тестов\. Ваш код идеален, что там тестировать\! Ведь не зря вы настоящие C\+\+ программисты\. \{[21](https://pvs-studio.ru/ru/blog/posts/cpp/0939/#BadAdviceExplanationN21)\}
1. И статические анализаторы не используйте\. Это инструменты для студентов и неудачников\. \{[22](https://pvs-studio.ru/ru/blog/posts/cpp/0939/#BadAdviceExplanationN22)\}
1. Всегда и везде выкатывайте любые изменения сразу на продакшн\. Тестовые сервера – лишняя трата денег\.
1. Всегда, при любых ситуациях используйте как можно большее количество вложенных друг в друга объектов\. Сложность – это солидно\!
1. Никогда не используйте платные компоненты\. Только ломанные и с как можно более "левых" сайтов\. Не за что, в конце концов, платить другим программистам\. Тем более, если они вдруг использовали не C\+\+\. Фу\.
1. Не пользуйтесь стандартной библиотекой языка\. Что может быть интереснее, чем написать свои строки и списки с уникальным синтаксисом и семантикой? \{[26](https://pvs-studio.ru/ru/blog/posts/cpp/0939/#BadAdviceExplanationN26)\}
1. Смартпоинтеры и прочее RAII от лукавого, всеми ресурсами надо управлять вручную, это делает код простым и понятным\.
1. И вообще, выделение памяти — зло\. _char c\[256\]_ хватит всем, а если не хватит, то потом поменяем на 512\. В крайнем случае – на 1024\.
1. Не пользуйтесь системой контроля версий\. Храните исходники прямо на сервере в виртуалке\.
1. Выравнивание и единый стиль не дают раскрыться вашей индивидуальности и креативности\. Это притеснение свободы личности и самовыражения\. Каждый должен оформлять код так, как ему нравится\.
1. Побольше кода в заголовочных файлах, ведь так гораздо удобнее, а время компиляции возрастает очень незначительно\. \{[31](https://pvs-studio.ru/ru/blog/posts/cpp/0939/#BadAdviceExplanationN31)\}
1. Злые языки говорят, что _goto_ считается вредным, но это чушь\. Этот оператор очень мощен и способен заменить множество других\. Да здравствует _goto_ и аскетизм\!
1. Никогда не используйте enum'ы, они все равно неявно приводятся к _int_\. Используйте _int_ напрямую\! \{[33](https://pvs-studio.ru/ru/blog/posts/cpp/0939/#BadAdviceExplanationN33)\}
1. Используйте как можно больше разных систем сборки и пакетных менеджеров, покажите, что вы в курсе современных тенденций\! Разумеется, версии кода в пакетах для разных менеджеров должны быть немного разными, иначе пользователи заскучают\.
1. Проявите немного уважения к программистам прошлого – объявляйте все переменные в начале функций\. Это традиция\! \{[35](https://pvs-studio.ru/ru/blog/posts/cpp/0939/#BadAdviceExplanationN35)\}
1. Подключайте как можно больше хидеров, чтобы каждый \.cpp файл раскрывался в миллион строк – коллеги скажут спасибо за то, что у них больше времени на перекур во время пересборки\! \{[36](https://pvs-studio.ru/ru/blog/posts/cpp/0939/#BadAdviceExplanationN36)\}
1. Пишите ваши \.h\-файлы так, чтобы они зависели от других заголовков, и при этом не включайте их в свой заголовочный файл\. Пусть тот, кто инклудит, догадается, какие заголовки нужно заранее заинклудить перед использованием вашего файла\. Развлеките коллег квестами\!
1. Зачем нужны все эти _\*\_cast_, если есть _reinterpret\_cast_, который всегда работает? А ещё лучше и короче старый добрый C\-style cast: _\(Type\)\(expr\)_\.
1. Если решили написать функцию, то она должна быть мощной и универсальной, как швейцарский армейский нож, и должна принимать много аргументов\. Для экономии времени можно аргументы не перечислять, а парсить с помощью _va\_arg_\.
1. Что может быть плохого в том, чтобы через указатель на переменную посмотреть в соседнюю переменную? Мы же в пределах своей памяти\. \{[40](https://pvs-studio.ru/ru/blog/posts/cpp/0939/#BadAdviceExplanationN40)\}
1. Слово _const_ только место в коде занимает\. Если вы не хотите менять переменную, то просто не будете её менять\. \{[41](https://pvs-studio.ru/ru/blog/posts/cpp/0939/#BadAdviceExplanationN41)\}
1. А вы знаете, что вместо фигурных скобок можно использовать <% и %\>? Диграфы и триграфы могут придать вашему коду визуальную свежесть и необычность, что выделит его на фоне кода коллег\. И при этом ничего незаконного, они же есть в стандарте\.
1. Зачем инициализировать переменные, если там и так нули? Я вот недавно не инициализировал, и там ноль был\. Всё работало\.
1. _private_ для параноиков\. Кому они нужны, эти поля класса?
1. Заведите как можно больше переменных, которые будут отличаться в названиях только числами: _index1_, _index2_\. \{[45](https://pvs-studio.ru/ru/blog/posts/cpp/0713/)\}
1. Пишите код так, как будто его будет читать председатель жюри IOCCC, и он знает, где вы живёте \(чтоб приехать и вручить вам приз\)\. \{[46](https://pvs-studio.ru/ru/blog/posts/cpp/0939/#BadAdviceExplanationN46)\}
1. Если в C\+\+ переносы строк и отступы незначимые, то почему бы не оформить код в виде зайчика или белочки?
1. Все знают, что операторы обращения по индексу к указателю обладают коммутативностью\. Так не будьте серыми, как все\. Придайте коду оригинальность, используя конструкции вида _1\[array\] \= 0_\.
1. Перегрузите как можно больше операторов, в том числе и не арифметических, для как можно большего количества типов\. Придавая операторам другой смысл, вы приближаетесь к созданию своего диалекта языка\. Свой язык – это прикольно\. А если ещё и макросы к делу подключить\.\.\.
1. Универсальный _std::string_ – это неэффективно\. Можно ловчее и эффективнее использовать _realloc_, _strlen_, _strncat_ и так далее\. \{[50](https://pvs-studio.ru/ru/blog/posts/cpp/0939/#BadAdviceExplanationN50)\}
1. Раз допустимо ссылаться на следующий элемент за пределами массива, то значит, можно к этому элементу и обращаться\. Ой, это же уже 51\-й пункт списка, а их должно было быть 50\. Сорри, но какая C\+\+ статья без [off\-by\-one error](https://cwe.mitre.org/data/definitions/193.html) :\)\. \{[51](https://pvs-studio.ru/ru/blog/posts/cpp/0939/#BadAdviceExplanationN51)\}

Возможно, читая статью, вы вспомнили о ком\-то из коллег :\)\. Тогда самое время отправить ему этот текст\. Пока\! До встреч в отладчике\!