Я видел несколько программ, в которых код C и C++ смешивался в одной программе C++ (даже на собеседованиях по программированию).
Насколько я знаю, все типы задач можно решить и разработать только с использованием C++, поэтому мне интересно, есть ли случаи, когда нужно будет вводить код C в вашу программу через библиотеку <cstdio>?
Если вы хотите использовать современный <print>, вы косвенно используете <cstdio>std::FILE (stdout). Или вы можете использовать его напрямую: std::println(stderr, "Error code {}", code);
Что приходит на ум: iostream имеет свои проблемы, но в основном они решаются fmt::print и позже std::print. Структура FILE в любом случае не является взаимоконвертируемой в fstream, и во многих API требуется первая. C++26 filestream::native_handle может помочь решить часть проблемы.
C IO может быть быстрее, чем потоки C++. Хотя в целом я бы сказал люди преподают C , а затем «C с классами» вместо преподавания C++ — и такие студенты склонны использовать то, что знают.
У меня наоборот - причина не использовать. Если программист предполагает, что будет использоваться только <iostream>, он может добавить ios_base::sync_with_stdio(false) в программу, что сделает <iostream> быстрее, но сломает <cstdio>.
В начале C++ была только библиотека C. STL был представлен в 1994 году и до сих пор не имел большого количества функций, поэтому многие заголовки библиотек C имеют зеркала на C++ в форме с префиксом «c». Так что теперь <cstdio> все еще здесь больше по историческим причинам (и обратной совместимости), чем по необходимости. Как указано выше, iostream оказался неуклюжим, а C++23 std::print (fmt перенесен в стандартную библиотеку).
@PiotrSiupa sync_with_stdio(false) не ломается <cstdio>. Это просто означает, что вы не можете произвольно чередовать операции ввода-вывода C++ и C IO в одних и тех же потоках без явного сброса их между ними.
Этот вид программирования обычно встречается только в соревновательном программировании. На самом деле это не должно быть технической проблемой из-за обратной совместимости с «C» (и именно поэтому «C» все еще доступен). Но вообще не рекомендуется писать новый код с использованием заголовков «C». Посмотрите это Перестаньте учить «C» и прочитайте Основные рекомендации по C++. Если вы понимаете эти рекомендации, используйте эту информацию на собеседованиях :)
Это явно не основано на мнениях – существует множество веских объективных причин.
Я предпочитаю FILE IO с unique_ptr и <print>/<format><iostream>; Хотя MSVC объявила устаревшими некоторые функции ISO C++, и мне нужно добавить предопределенный макрос, чтобы обойти это.
@PepijnKramer - помимо конкурентного кодирования, он используется почти исключительно во встроенном программировании, а также для увеличения объема памяти.





Вычислительная часть, такая как вывод или ввод в C++, требует большего объема памяти, чем вывод или ввод в C.
Поэтому при попытке использовать методы оптимизации, уменьшающие объем вычислений и уменьшающие использование памяти, используются такие библиотеки, как <cstdio>.
С++: cout<< val << endl;
С: printf("%d", val);
cout — это переменная класса объекта, и при выводе она потребляет столько же памяти, сколько и объект вместе с вызовом класса.
Однако printf учитывает только потребности переменной val.
«Однако «printf» использует только емкость переменной val». В большинстве систем также есть какой-то объект для stdout; это просто не так заметно для пользователя. Я сомневаюсь, что это будет веской причиной для выбора одного из них в современных размещенных системах.
cout — глобальный объект. Это может быть размер класса, но существует только один его экземпляр. Все операторы, использующие cout, будут использовать один экземпляр, так что это вряд ли является фактором уменьшения выходной памяти.
C++ в основном совместим с C по уважительной причине: вы можете легко повторно использовать существующий код C в своей программе на C++.
Если у вас есть реализация алгоритма, который выводит полезную информацию с помощью printf, просто скомпилируйте и запустите его, чтобы получить результаты. Точно так же, как вам не нужно переводить реализацию алгоритма на другой язык, вам не нужно портировать мини-язык printf на синтаксис C++. Кроме того, если вы внесете небольшие изменения в эту «устаревшую» реализацию, какой синтаксис вы будете использовать для новых сообщений? Вы можете предпочесть синтаксис printf, чтобы код выглядел более единообразным.
В частности, в отношении синтаксиса iostream есть некоторая критика, которая предполагает, что синтаксис printf лучше (например, строки легче читаются; нет редко необходимых накладных расходов «локали» во время выполнения). Так что, возможно, вам следует использовать синтаксис std::format, если можете (C++20), или придерживаться printf, если пока не можете.
cstdio— это библиотека C++, отражающая библиотеку Cstdio.h. Вопрос в его нынешнем виде, вероятно, слишком широк, но да, это так.