Есть ли веская причина использовать код стиля C (<cstdio>) в программах на C++?

Я видел несколько программ, в которых код C и C++ смешивался в одной программе C++ (даже на собеседованиях по программированию).

Насколько я знаю, все типы задач можно решить и разработать только с использованием C++, поэтому мне интересно, есть ли случаи, когда нужно будет вводить код C в вашу программу через библиотеку <cstdio>?

cstdio — это библиотека C++, отражающая библиотеку C stdio.h. Вопрос в его нынешнем виде, вероятно, слишком широк, но да, это так.
Passer By 15.05.2024 11:45

Если вы хотите использовать современный <print>, вы косвенно используете <cstdio>std::FILE (stdout). Или вы можете использовать его напрямую: std::println(stderr, "Error code {}", code);

Artyer 15.05.2024 11:48

Что приходит на ум: iostream имеет свои проблемы, но в основном они решаются fmt::print и позже std::print. Структура FILE в любом случае не является взаимоконвертируемой в fstream, и во многих API требуется первая. C++26 filestream::native_handle может помочь решить часть проблемы.

Weijun Zhou 15.05.2024 11:48

C IO может быть быстрее, чем потоки C++. Хотя в целом я бы сказал люди преподают C , а затем «C с классами» вместо преподавания C++ — и такие студенты склонны использовать то, что знают.

Yksisarvinen 15.05.2024 11:49

У меня наоборот - причина не использовать. Если программист предполагает, что будет использоваться только <iostream>, он может добавить ios_base::sync_with_stdio(false) в программу, что сделает <iostream> быстрее, но сломает <cstdio>.

Piotr Siupa 15.05.2024 11:54

В начале C++ была только библиотека C. STL был представлен в 1994 году и до сих пор не имел большого количества функций, поэтому многие заголовки библиотек C имеют зеркала на C++ в форме с префиксом «c». Так что теперь <cstdio> все еще здесь больше по историческим причинам (и обратной совместимости), чем по необходимости. Как указано выше, iostream оказался неуклюжим, а C++23 std::print (fmt перенесен в стандартную библиотеку).

Marek R 15.05.2024 11:59

@PiotrSiupa sync_with_stdio(false) не ломается <cstdio>. Это просто означает, что вы не можете произвольно чередовать операции ввода-вывода C++ и C IO в одних и тех же потоках без явного сброса их между ними.

Konrad Rudolph 15.05.2024 12:01

Этот вид программирования обычно встречается только в соревновательном программировании. На самом деле это не должно быть технической проблемой из-за обратной совместимости с «C» (и именно поэтому «C» все еще доступен). Но вообще не рекомендуется писать новый код с использованием заголовков «C». Посмотрите это Перестаньте учить «C» и прочитайте Основные рекомендации по C++. Если вы понимаете эти рекомендации, используйте эту информацию на собеседованиях :)

Pepijn Kramer 15.05.2024 12:28

Это явно не основано на мнениях – существует множество веских объективных причин.

Peter - Reinstate Monica 15.05.2024 12:28

Я предпочитаю FILE IO с unique_ptr и <print>/<format><iostream>; Хотя MSVC объявила устаревшими некоторые функции ISO C++, и мне нужно добавить предопределенный макрос, чтобы обойти это.

Red.Wave 15.05.2024 16:53

@PepijnKramer - помимо конкурентного кодирования, он используется почти исключительно во встроенном программировании, а также для увеличения объема памяти.

David C. Rankin 16.05.2024 01:32
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
11
140
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вычислительная часть, такая как вывод или ввод в C++, требует большего объема памяти, чем вывод или ввод в C.

Поэтому при попытке использовать методы оптимизации, уменьшающие объем вычислений и уменьшающие использование памяти, используются такие библиотеки, как <cstdio>.

С++: cout<< val << endl;

С: printf("%d", val);

cout — это переменная класса объекта, и при выводе она потребляет столько же памяти, сколько и объект вместе с вызовом класса.

Однако printf учитывает только потребности переменной val.

«Однако «printf» использует только емкость переменной val». В большинстве систем также есть какой-то объект для stdout; это просто не так заметно для пользователя. Я сомневаюсь, что это будет веской причиной для выбора одного из них в современных размещенных системах.

user694733 15.05.2024 14:51
cout — глобальный объект. Это может быть размер класса, но существует только один его экземпляр. Все операторы, использующие cout, будут использовать один экземпляр, так что это вряд ли является фактором уменьшения выходной памяти.
Remy Lebeau 15.05.2024 23:32

C++ в основном совместим с C по уважительной причине: вы можете легко повторно использовать существующий код C в своей программе на C++.

Если у вас есть реализация алгоритма, который выводит полезную информацию с помощью printf, просто скомпилируйте и запустите его, чтобы получить результаты. Точно так же, как вам не нужно переводить реализацию алгоритма на другой язык, вам не нужно портировать мини-язык printf на синтаксис C++. Кроме того, если вы внесете небольшие изменения в эту «устаревшую» реализацию, какой синтаксис вы будете использовать для новых сообщений? Вы можете предпочесть синтаксис printf, чтобы код выглядел более единообразным.


В частности, в отношении синтаксиса iostream есть некоторая критика, которая предполагает, что синтаксис printf лучше (например, строки легче читаются; нет редко необходимых накладных расходов «локали» во время выполнения). Так что, возможно, вам следует использовать синтаксис std::format, если можете (C++20), или придерживаться printf, если пока не можете.

Другие вопросы по теме