Например printf
вместо cout
, scanf
вместо cin
, используя макросы #define
и т.д.?
Неплохо ли использовать C-функции на С++?
Ответ 1
Я бы не сказал плохо, потому что это будет зависеть от личного выбора. Моя политика заключается в том, что в С++ есть альтернативы типа безопасности, используйте их, поскольку это уменьшит ошибки в коде.
Ответ 2
Это зависит от того, какие функции. Использование макросов define
в С++ сильно недооценивается и по уважительной причине. Вы почти всегда можете заменить использование макроса define
чем-то более удобным и безопасным в С++ (шаблоны, встроенные функции и т.д.).
FILE*
с его множеством функций.
И еще одно: при всем уважении к множеству возможностей форматирования потока, для таких вещей, как простые отладочные распечатки, IMHO вы просто не можете победить сжатость printf
и ее строку формата.
Ответ 3
Я бы сказал, что единственными, которые действительно вредны для смешивания, являются пары между malloc
/free
и new
/delete
.
В противном случае это действительно вещь стиля... и в то время как C совместим с С++, зачем вам смешивать два языка, когда С++ имеет все, что вам нужно, не отступая?
Ответ 4
Вы должны обязательно использовать printf
вместо cout
. Последнее позволяет вам делать большинство или все элементы управления форматированием printf
, но делает это в состоянии. То есть текущий режим форматирования сохраняется как часть (глобального) объекта. Это означает, что плохой код может оставить cout
в состоянии, в котором последующий вывод будет искажен, если вы не reset все форматирование каждый раз, когда вы его используете. Это также наносит ущерб использованию с резьбой.
Ответ 5
В большинстве случаев есть лучшие решения, но не все.
Например, люди часто используют memcpy
. Я бы почти никогда этого не делал (кроме кода на самом низком уровне). Я всегда использую std::copy
, даже на указателях.
Тот же подсчет для подпрограмм ввода/вывода. Но верно, что иногда C-стиль printf
значительно проще в использовании, чем cout
(особенно при регистрации). Если Boost.Format не является опцией, то уверен, используйте C.
#define
- совсем другой зверь. На самом деле это не C-единственная функция, и в С++ есть много законных применений. (Но гораздо больше, чем arent.)
Конечно, вы никогда не использовали его для определения констант (для чего const
), а также для объявления встроенных функций (используйте inline
и шаблоны!).
С другой стороны, часто бывает полезно создавать утверждения отладки и обычно как инструмент генерации кода. Например, Im-модульные шаблоны классов без использования макросов, это будет настоящей болью в * ss. Использование макросов здесь неплохо, но оно сохраняет буквально тысячи строк кода.
Ответ 6
Для распределений я бы вообще избегал использования malloc/free и просто придерживался нового/delete.
Ответ 7
Не совсем, printf()
работает быстрее, чем cout
, а библиотека iostream С++ довольно велика. Это зависит от предпочтений пользователя или самой программы (она нужна? И т.д.). Кроме того, scanf()
больше не подходит для использования, я предпочитаю fgets()
.
Ответ 8
Что можно использовать или не только зависит от компилятора, который будет использоваться. Поскольку вы программируете на С++, на мой взгляд, чтобы максимизировать совместимость, лучше использовать то, что предоставляет С++ вместо c-функций, если у вас нет других вариантов.
Ответ 9
Исходя из немного другого угла, я бы сказал, что плохо использовать scanf в C, не говоря уже о С++. Пользовательский ввод - это далеко не переменная, которая должна быть надежно проанализирована с помощью scanf.
Ответ 10
Я бы опубликовал комментарий к другому ответу, но так как не могу... C printf() лучше, чем С++ iostream из-за интернационализации. Хотите перевести строку и поместите встроенный номер в другое место? Невозможно сделать это с помощью ostream. Спецификация формата printf() - это совсем маленький язык для себя, интерпретируемый во время выполнения.