Мне просто интересно, все ввод / вывод в C ++ осуществляется через стандартные заголовочные файлы библиотеки, что означает (для библиотек C ++ std) потоки ввода и вывода или (для библиотек C std) означает стандартные функции ввода / вывода.
Мой вопрос Можно ли вообще их не использовать, а напрямую взаимодействовать с stdin и stdout ОС?
В C ++, без использования каких-либо заголовков, я имею в виду.
Я прочитал ваш вопрос как: Могу ли я получить доступ к функциям ввода-вывода без #include заголовочных файлов. Я вижу, что другие люди интерпретировали это как «без включения стандартных заголовочных файлов библиотеки»
Простой ответ «нет». Ввод / вывод не встроен в компилятор. Предоставляется библиотеками.
Более сложный ответ: вы можете реплицировать содержимое необходимых заголовочных файлов непосредственно в ваши файлы .cpp, чтобы определить поддержку стандартной библиотеки (или определить методы поддержки ОС). Это было бы глупо, но это возможно.
Историческое отступление в ответ на комментарии:
Когда C
язык впервые вышел, он был революционным по многим причинам. Один из наиболее важных решений разработчиков языка (который сейчас считается само собой разумеющимся в большинстве современных языков) заключается в том, что компилятор и язык, который он принимает, должны быть как можно меньше, не теряя функциональности. Это сделало C
Компилятор крошечный по сравнению с другими компиляторами, доступными в то время (FORTRAN, COBOL и т. д.)
Компилятор был ориентирован на составление (Не красивая печать источника, или ….)
Язык был сосредоточен на том, чтобы сделать все возможное, не делая ничего обязательного. Если вы писали встроенную программу, которая манипулировала битами на цифровом интерфейсе, вам не нужно было платить за возможность форматировать числа двойной точности для отображения на строчном принтере — во время компиляции или во время выполнения.
Это решение со стороны C
Языковые дизайнеры подвергались сомнению много раз на протяжении многих лет, но решение всегда принимало вызов. Это был правильный выбор в то время, и это все еще правильный выбор — это важный фактор, который делает C
и его потомки, фундамент, на котором была разработана большая часть остальной части нашей богатой вычислительной среды.
конечно, вы можете сделать это в системе Unix
#include <unistd.h>
int main(void)
{
write(1, "Hello world\n", 12);
}
или подобное в системе Windows, использующей вызовы операционной системы.
На самом деле, это то, что делает ядро Linux или, в этом отношении, любое другое ядро os. Написание кода для работы с системой полностью возможно даже без #include
линия. Например, kprintf
Функция в ядре Linux является примером такой функции, она не имеет зависимостей stl, поскольку ядро является автономным.
Конечно, это может быть невозможно в пользовательском пространстве, поскольку ОС ограничивает доступ к частям памяти, связанным с размещением содержимого на экране.