Ваше нелюбимое руководство по программированию на C++

Как аналог Рекомендация по программированию на C++ 102, какой из 101 руководство Саттера и Александреску вы чаще всего нарушаете или игнорируете и почему?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
734
8

Ответы 8

Я бы сказал, что это наверное 16. Избегайте макросов. Я считаю, что есть много вещей, которые я могу делать только с макросами (особенно встраивание __FILE__ и __LINE__ в выражения), и во многих случаях мне нужно компактное выражение, которое работает во внешнем контексте функции (например, проверка кодов результатов и возврат ). В результате мой код имеет тенденцию обильно посыпать утверждениями, например, в форме макросов, поэтому я бы сказал, что это тот, который я совсем немного игнорирую.

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

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

Хороший момент: хотя я обычно избегаю макросов, они, безусловно, имеют разумное применение.

Evan Teran 24.10.2008 00:57

Дело в том, что «избегать» - это не то же самое, что «никогда не использовать». Отсутствие лучшей альтернативы звучит как достаточно хорошее объяснение, чтобы использовать их, соблюдая рекомендации.

JB. 16.01.2009 16:23

Честно говоря, со временем у меня выработались привычки, которые почти идеально соответствуют этим рекомендациям. Следование этим типам стандартов кодирования приводит к чистому и простому в сопровождении коду.

№ 56 - Использовать вектор по умолчанию. Вместо этого я часто использую дек. Интересно, что Herb Sutter кажется, что он не согласен с этим сам.

Только вчера я сломал 19 (всегда инициализировать переменные) на этом сайте. Мой фрагмент кода был:

uint64_t i = getIEEEbitpatternByMeansRelevantToTheQuestion();
double d;
memcpy(&d, &i, 8);

Не вижу смысла в инициализации d: нет значения, которое могло бы иметь смысл, и компилятор либо проигнорирует значение, которое я предоставляю, либо сделает с ним что-то расточительное.

Инициализация типов, не относящихся к POD, и типов POD, которые являются членами классов, в высшей степени разумна. Инициализировать что-то только для memcpy / memset поверх него, не так уж и много.

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

Однако у меня нет книги, так что, возможно, они имеют в виду именно это, а слово «всегда» в названии вводит в заблуждение.

Но вы инициализировали d - вы просто использовали memcpy для его инициализации!

Michael Kohne 16.01.2009 16:46

Вы можете сделать: double d = * ((double *) & i); вместо. Вообще не нужно использовать memcpy.

Skizz 16.01.2009 16:58

Боюсь, что мне иногда нравится хороший актерский состав в стиле «си». (Я понимаю проблемы с этим - ничего не могу с собой поделать)

Я игнорирую большинство из них, потому что их можно резюмировать так: используйте C++, как если бы это был объектно-ориентированный язык высокого уровня. Но если вам нужен объектно-ориентированный язык высокого уровня, есть гораздо лучшие кандидаты (C#, Java, Lisp, Python и т. д.). C++, по сути, является матерью всех структурированных сборщиков макросов, и я использую его как таковой, и только там, где это требуется.

Эээ, похоже, вы думаете о C, а не о C++.

jalf 16.01.2009 09:11

Ну, я думаю о C++, а не о Java--;)

rwallace 16.01.2009 13:59

После просмотра все правила это будет: 89. Правильно пишите функциональные объекты. Я никогда не трачу время, чтобы написать их правильно. Иногда я использую вариативные функции, но это не совсем то, что у меня есть.

72. Предпочитайте использовать исключения для сообщения об ошибках.

Вместо этого я использую 72-АЛЬТ. Не бросайте исключения. :)

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

Другие вопросы по теме