Как найти (и заменить) все старые приведения типов данных в стиле C в моем исходном коде C++?

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

Я использую Visual Studio, может быть, есть какое-то предупреждение компилятора, которое мне нужно включить?


person ju.    schedule 13.08.2009    source источник


Ответы (4)


GCC имеет параметр -Wold-style-cast, который предупредит вас, если обнаружит какие-либо приведения в стиле C.

person Andrew Keeton    schedule 13.08.2009
comment
Но я использую Visual C++ (MFC) :( - person ju.; 15.08.2009
comment
Возможно, вы захотите проверить переключатели компилятора Visual C++, чтобы увидеть, есть ли один из них для отключения этого предупреждения или есть ли у них переключатель, который вы можете указать для отключения определенных предупреждений. Если такого переключателя нет, вы можете отключить предупреждение с помощью прагмы в файлах, вызывающих нарушение. Я использовал with с Visual C++, чтобы отключить некоторые предупреждения о длине имен STL при компиляции. - person Glenn; 18.08.2009

Я не знаю переключателя компилятора, который сообщает об этом или о чем-то еще, встроенном в Visual Studio.

Однако вот скрипт Perl, который будет искать вашего исходного дерева и найдите все приведения стиля C в вашем исходном коде. Это работает довольно хорошо для их отслеживания.

person Reed Copsey    schedule 13.08.2009

К сожалению, в Visual C++ нет предупреждения компилятора, указывающего на эти приведения (по крайней мере, я не знаю), хотя похоже, что PC-Lint действительно предоставляет предупреждение/примечание, которое предупреждает вас, если вы используете старый стиль В ролях. Зависит от того, готовы ли вы потратить деньги на PC-Lint - на мой взгляд, он определенно стоит того, чтобы решить все проблемы, которые вы можете с ним найти...

person Timo Geusch    schedule 13.08.2009

Зачем тебе это надо? Вы хотите избавиться от них всех?

Приведения в стиле C для фундаментальных типов, таких как (double), безопасны и выглядят намного лучше, чем static_cast<double>(). Я лично предпочитаю этот стиль.

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

ОБНОВИТЬ:

Ребят, кажется я не так однозначно выразил свое мнение. Да, я знаю теорию: C++-cast — это хорошо, C-cast — это зло. Это правило (и большинство других) нужно, чтобы уберечь новичков от C++. Но это не значит, что нужно всегда ей следовать.

Я хочу сказать, что приведения в стиле C не так уж и ужасны. Если вы напишите какую-то функцию, например

int convertFooToBar(double i_foo)

, нет причин использовать в реализации приведения типов в стиле C++. Они не безопаснее, чем (int), но выглядят неряшливо. Кастинг в этом случае не представляет сложности. В литье вообще нет ничего плохого или хитрого: иногда броски бывают естественными.

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

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

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

person bocco    schedule 18.08.2009
comment
Хотя он может работать как static_cast, проблема в том, что он может незаметно переключиться на работу как reinterpret_cast, когда вы измените окружающий код. Проблема в том, что вы неправильно выражаете то, что хотите, и компилятор может выполнять любое приведение, которое лучше всего подходит. Измените окружающий код, и ваш C-приведение изменит свое значение и сломает ваш код. И, конечно же, предметом этого вопроса является бонусная проблема: их невозможно найти. Немного неловко не иметь возможности найти используемые вами приведения, особенно когда они так подвержены ошибкам. - person jalf; 18.08.2009
comment
и, наконец, намеренно они уродливы. Приведения являются уродливым трюком. Они должны выглядеть уродливо, чтобы было понятно, что они происходят, и чтобы вы не злоупотребляли ими. ;) - person jalf; 18.08.2009
comment
Именно эта проблема, когда пользователь не может найти приведения типов в своем коде, является одной из причин, по которым предпочтение следует отдавать приведениям в стиле C++. - person JohnMcG; 19.08.2009