2015-02-05 2 views
0

Я читал, что язык C не содержит инструкций ввода и вывода и что printf, scanf, getchar, putchar фактически являются функциями.определение функции printf на языке C

Каковы первоначальные инструкции языка C для получения функции printf? Спасибо.

+2

Вы пытались сказать «системные вызовы»? –

+0

Возможный дубликат [Код для функции printf в C] (http://stackoverflow.com/questions/4867229/code-for-printf-function-in-c) – usr2564301

ответ

2

Если вы хотите использовать printf, вы должны #include <stdio.h>. Этот файл объявляет эту функцию.

Если вы думали о том, как printf реализован: printf может внутренне вызывать любые другие функции и, вероятно, спускается до putc (также часть времени выполнения C), чтобы выписывать символы один за другим. В конце концов одна из функций должна действительно написать символ на консоли. Как это делается, зависит от операционной системы. В Linux, например, printf может внутренне вызвать функцию Linux write. В Windows printf можно внутренне вызвать WriteConsole.

+0

Во встроенной системе я видел вызов 'printf' 'putc'. Реализация 'putc' осталась разработчику, т. Е. Мне пришлось написать' putc' и решить, что это значит в моей системе. Например, это может быть написано на uart или любое другое устройство в системе. – 4386427

+1

@nielsen: 'putc()' само по себе является функцией, определяемой стандартной библиотекой. Если реализация 'putc()' оставлена ​​разработчику, это означает, что она не обеспечивает полностью совместимую реализацию библиотеки. Это неплохо, разум - стандарт явно позволяет использовать только подмножество стандартных заголовков («автономная» среда). – DevSolar

+0

@Nielsen Я знаю, printf напрямую не вызывает запись или WriteConsole. Я думал, что мой ответ будет легче, если я отвлекся от этого. Но поскольку вы правы, я теперь изменил свой ответ, чтобы быть более технически правильным. –

1

Функционирование printf задокументировано here; на самом деле, он не является частью языка C. Сам язык не предоставляет средств для ввода и вывода. Функция printf определена в библиотеке, к которой можно получить доступ, используя директиву компилятора #include <stdio.h>.

+0

Следует отметить, что стандартная библиотека определена в том же документе, что и остальная часть lanugage. – DevSolar

1

Никакой язык программирования не предоставляет истинные «примитивы» для ввода-вывода. Любые «примитивы ввода-вывода» полагаются на более низкие уровни абстракции, на этом языке или в другом.

I/O, на самом низком уровне, нуждается в доступе к оборудованию. Возможно, вы смотрите на прерывания BIOS, порты аппаратного ввода-вывода, управляемые памятью контроллеры устройств или что-то еще, в зависимости от того, какое оборудование работает на вашем компьютере.

Потому что это было бы реальное бремя для удовлетворения всех этих возможностей в реализации языка программирования, уровень абстракции оборудования используетс. К индивидуальным контроллерам ввода-вывода обращаются аппаратные драйверы, которые, в свою очередь, контролируются операционной системой, которая предоставляет услуги ввода-вывода разработчику приложения через определенный абстрактный API. К ним могут быть доступны непосредственно (например, сборку пользовательского пространства) или дополнительно завернуты (например, путем реализации интерпретатора языка программирования или стандартных библиотечных функций).

ли вы смотрите на "команды", как (Баш) echo или библиотечных функций, таких как (Java) System.out.println() или (C) printf() или (C++) std::cout (Python) print, или, просто синтаксическая деталь: Любой Я/O проходит через несколько уровней абстракции, потому что это проще, и потому, что он защищает вас от всех видов ошибочных или вредоносных программ.

"примитивы" соответствующего языка. Если вы копаете дальше, вы покидаете царство языка и входите в область своей реализации .


Я как-то работал над реализацией библиотеки C самостоятельно.Собственность проекта имеет passed on с момента, но в основном он работал так:

  • printf() был реализован с помощью vfprintf() (как это было, в конце концов, каждая функция *printf() семьи).
  • vfprintf() использовал пару внутренних помощников, чтобы сделать причудливое форматирование, записывая в буфер.
  • Если буфер необходимо промыть, он передается внутренней функции writef().
  • Эта функция writef() должна быть реализована по-разному для каждой целевой системы. В POSIX он будет звонить write(). На Win32 он будет звонить WriteFile(). И так далее.
Смежные вопросы