Вопрос:

Синтаксические стили C ++

c++ coding-style casting

14243 просмотра

10 ответа

4069 Репутация автора

Вопрос, связанный с обычным приведением против static_cast и dynamic_cast :

Какой стиль синтаксиса приведения вы предпочитаете в C ++?

  • Синтаксис в стиле C: (int)foo
  • C ++ - стиль синтаксиса приведения: static_cast<int>(foo)
  • синтаксис конструктора: int(foo)

Они могут не переводить в точности одинаковые инструкции (не так ли?), Но их эффект должен быть одинаковым (верно?).

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

Как вы думаете?

Автор: palm3D Источник Размещён: 28.08.2008 01:01

Ответы (10)


1 плюс

7342 Репутация автора

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

Автор: CiNN Размещён: 28.08.2008 01:04

12 плюса

9619 Репутация автора

По словам Страуструпа :

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

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

Автор: hometoast Размещён: 28.08.2008 01:07

1 плюс

15337 Репутация автора

Кастинг в стиле C - худший путь. Его труднее увидеть, не заметить, объединить различные действия, которые не следует смешивать, и не может сделать все, что могут делать приведения в стиле C ++. Они действительно должны были удалить броски в стиле C из языка.

Автор: DrPizza Размещён: 28.08.2008 01:11

50 плюса

417612 Репутация автора

Решение

Лучше никогда не использовать приведение в стиле C по трем основным причинам:

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

Как отмечает palm3D:

Я нахожу синтаксис в стиле C ++ слишком многословным.

Это сделано намеренно по причинам, указанным выше.

Синтаксис конструктора (официальное имя: приведение в стиле функции) семантически совпадает с приведением в стиле C, и его также следует избегать (за исключением инициализации переменных при объявлении) по тем же причинам. Это спорно , должно ли это быть правда , даже для типов , которые определяют пользовательские конструктор , но в эффективном C ++, Мейерс утверждает , что даже в тех случаях , следует воздержаться от их использования. Проиллюстрировать:

void f(auto_ptr<int> x);

f(static_cast<auto_ptr<int> >(new int(5))); // GOOD
f(auto_ptr<int>(new int(5));                // BAD

static_castЗдесь будет на самом деле вызвать auto_ptrконструктор.

Автор: Konrad Rudolph Размещён: 28.08.2008 01:16

2 плюса

304471 Репутация автора

Я использую static_cast по двум причинам.

  1. Ясно ясно, что происходит. Я не могу перечитать это, не осознавая, что происходит актерский состав. С приведениями в стиле C ваш глаз может пройти прямо через него без паузы.
  2. В моем коде легко найти каждое место, где я веду каст.
Автор: Bill the Lizard Размещён: 28.08.2008 01:16

2 плюса

15619 Репутация автора

Определенно стиль C ++. Дополнительный набор текста поможет вам избежать каста, когда вы не должны :-)

Автор: Ben Collins Размещён: 28.08.2008 01:17

5 плюса

16255 Репутация автора

Что касается этой темы, я следую рекомендациям Скотта Мейерса ( Более эффективный C ++ , пункт 2: Предпочитают приведение в стиле C ++).

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

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

Автор: Jérôme Размещён: 28.08.2008 01:19

1 плюс

37473 Репутация автора

В настоящее время мы используем повсеместное приведение в стиле C. Я задал другой вопрос о кастинге , и теперь я вижу преимущество использования static_cast вместо этого, если по какой-то другой причине, кроме как «greppable» (мне нравится этот термин). Я, вероятно, начну использовать это.

Мне не нравится стиль C ++; это выглядит слишком похоже на вызов функции.

Автор: Graeme Perrow Размещён: 28.08.2008 01:30

1 плюс

11 Репутация автора

Переходите на стиль C ++ и, что еще хуже, уродливые подробные фрагменты кода, которые включали явную типизацию C ++, будут постоянным напоминанием о том, что мы все знаем (то есть явное приведение плохо - ведет к монетизации ругательств). Не используйте стиль C ++, если вы хотите овладеть искусством отслеживания ошибок во время выполнения.

Автор: CAH Размещён: 26.02.2012 09:18

1 плюс

2618 Репутация автора

Синтаксис конструктора. C ++ - ОО, конструкторы существуют, я их использую. Если вы чувствуете необходимость аннотировать эти преобразователи, вы должны делать это для каждого типа, а не только для встроенных. Может быть, вы используете ключевое слово «явное» для преобразования кодоров, но синтаксис клиента имитирует именно то, что делает синтаксис ctor для встроенных типов. Возможно, это правда, но удивительно, что ввод большего количества символов облегчает поиск. Зачем относиться к этим как к особенным? Если вы пишете математические формулы с большим количеством int / unsigned / ... для и из double / float - graphics - и вам нужно каждый раз писать static_cast, внешний вид формулы становится загроможденным и очень нечитаемым. И в любом случае это тяжелая битва, так как много раз вы обращаетесь, даже не замечая, что вы есть.

Автор: QBziZ Размещён: 23.12.2016 02:48
Вопросы из категории :
32x32