Это плохая практика использовать функции C в C ++? - PullRequest
18 голосов
/ 28 сентября 2010

Например printf вместо cout, scanf вместо cin, с использованием #define макросов и т. Д.?

Ответы [ 10 ]

17 голосов
/ 28 сентября 2010

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

15 голосов
/ 28 сентября 2010

Зависит от того, какие функции. Использование define макросов в C ++ решительно осуждается и имеет на то веские причины. Почти всегда можно заменить использование макроса define на что-то более удобное и безопасное в C ++ (шаблоны, встроенные функции и т. Д.)

С другой стороны, некоторые люди справедливо считают, что потоки очень медленные, и я видел много действительного и высококачественного кода C ++, использующего C FILE* с его множеством функций.

И еще: при всем уважении к возможностям форматирования потоков, для таких вещей, как простые отладочные распечатки, ИМХО, вы просто не можете превзойти краткость printf и строку форматирования.

8 голосов
/ 28 сентября 2010

Вы должны определенно использовать printf вместо cout. Последний делает , позволяя вам сделать большинство или все элементы управления форматированием, которые допускает printf, но делает это с сохранением состояния . То есть текущий режим форматирования сохраняется как часть (глобального) объекта. Это означает, что плохой код может оставить cout в состоянии, когда последующий вывод будет неверно отформатирован, если только вы не сбросите все форматирование каждый раз, когда используете его. Это также наносит ущерб многопоточному использованию.

8 голосов
/ 28 сентября 2010

Я бы сказал, что единственные, которые действительно вредны для микширования, - это пары между malloc / free и new / delete.

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

7 голосов
/ 28 сентября 2010

Существуют лучшие решения для большинства случаев, но не для всех.

Например, люди довольно часто используют memcpy. Я бы почти никогда не делал этого (за исключением действительно низкоуровневого кода). Я всегда использую std::copy, даже на указателях.

То же самое относится к процедурам ввода / вывода. Но это правда, что иногда стиль C printf значительно проще в использовании, чем cout (особенно при ведении журнала). Если Boost.Format не является опцией, тогда обязательно используйте C.

#define совершенно другой зверь. Это на самом деле не только функция C, и для C ++ есть много законных применений. (Но многие другие, которых нет.)

Конечно, вы никогда не будете использовать его для определения констант (для этого const) и для объявления встроенных функций (используйте inline и шаблоны!).

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

2 голосов
/ 28 сентября 2010

Для распределений я бы вообще не использовал malloc / free и просто придерживался new / delete.

0 голосов
/ 28 сентября 2010

Я бы просто оставил комментарий к другому ответу, но так как не могу ... printf () C лучше, чем iostream C ++ из-за интернационализации. Хотите перевести строку и поместить встроенный номер в другое место? Не могу сделать это с ostream. Спецификация формата printf () представляет собой целый маленький язык, интерпретируемый во время выполнения.

0 голосов
/ 28 сентября 2010

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

0 голосов
/ 28 сентября 2010

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

0 голосов
/ 28 сентября 2010

Не совсем, printf() гораздо быстрее, чем cout, а библиотека c ++ iostream довольно большая.Это зависит от предпочтений пользователя или самой программы (нужно ли это? И т. Д.).Кроме того, scanf() больше не подходит для использования, я предпочитаю fgets().

...