Как я могу найти все старые приведения в стиле C в моем источнике?
Я использую Visual Studio, может быть, есть какое-то предупреждение компилятора, которое мне нужно включить?
Как я могу найти все старые приведения в стиле C в моем источнике?
Я использую Visual Studio, может быть, есть какое-то предупреждение компилятора, которое мне нужно включить?
GCC имеет параметр -Wold-style-cast
, который предупредит вас, если обнаружит какие-либо приведения в стиле C.
Я не знаю переключателя компилятора, который сообщает об этом или о чем-то еще, встроенном в Visual Studio.
Однако вот скрипт Perl, который будет искать вашего исходного дерева и найдите все приведения стиля C в вашем исходном коде. Это работает довольно хорошо для их отслеживания.
К сожалению, в Visual C++ нет предупреждения компилятора, указывающего на эти приведения (по крайней мере, я не знаю), хотя похоже, что PC-Lint действительно предоставляет предупреждение/примечание, которое предупреждает вас, если вы используете старый стиль В ролях. Зависит от того, готовы ли вы потратить деньги на PC-Lint - на мой взгляд, он определенно стоит того, чтобы решить все проблемы, которые вы можете с ним найти...
Зачем тебе это надо? Вы хотите избавиться от них всех?
Приведения в стиле 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. Но это не значит, что нужно искать в коде старые и пытаться избавиться от них всех. На самом деле, это не настоящая проблема. Просто не тратьте свое время. Вы можете потратить их на поиск и удаление устаревшего кода. Это было бы более полезно для вашей кодовой базы.