Intereting Posts
использование getenv и env не дает таких же результатов: Гарантировано ли, что memset будет обнулять биты заполнения в структуре? Как спекулятивная ошибка из-за оптимизации компилятора реализована под капотом? Как произвольно перемешать связанный список в C добавление нескольких слов с использованием флага переноса Трубы Unix – трубопровод между тремя процессами Почему autoconf не проходит тест AC_CHECK_HEADER, когда файл .h явно доступен? Как получить подстроку в C Обнаружение активности пользователя на mac os x Нужна помощь, чтобы понять, как \ n, \ b и \ r выдаст вывод printf Генерация гауссовских распределенных случайных чисел в C – как сохранить значения от 0 до 1 Развернуть macros внутри указанной строки Ошибка: управление может достигать конца не-void функции в C Указатель на первый элемент в массиве! (С) используя новый путь с execve для запуска команды ls

Что вы можете сделать в C без «std»? Являются ли они частью «С» или просто библиотек?

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

Я хотел бы знать, какие базовые инструменты / функции основаны на C, когда вы не включаете стандартные библиотеки, такие как stdio и stdlib .

Что делать, если нет printf() , fopen() и т. Д.?

Кроме того, являются ли эти библиотеки технически частью языка «C», или они просто очень полезны и эффективно необходимы библиотеки?

Стандарт C имеет это (5.1.2.3/5):

Наименьшие требования к соответствующей реализации:

– В точках последовательности летучие объекты стабильны в том смысле, что предыдущие обращения завершены, а последующие обращения еще не произошли.

– При завершении программы все данные, записанные в файлы, должны быть идентичны результату выполнения программы в соответствии с абстрактной семантикой.

– Динамика входных и выходных сигналов интерактивных устройств должна иметь место, как указано в 7.19.3.

Таким образом, без стандартных функций библиотеки единственное поведение, гарантируемое программой, связано со значениями изменчивых объектов, потому что вы не можете использовать какой-либо гарантированный доступ к файлам или «интерактивные устройства». «Pure C» обеспечивает взаимодействие только через стандартные библиотечные функции.

Pure C – это не вся история, так как ваше оборудование может иметь определенные адреса, которые делают определенные вещи при чтении или записи (будь то SATA или PCI-шина, необработанная видеопамять, serial port, что-то звучать или мигающий светодиод). Итак, зная что-то о вашем оборудовании , вы можете много писать в C без использования стандартных функций библиотеки. Потенциально, вы могли бы реализовать стандартную библиотеку C, хотя для этого может потребоваться доступ к специальным инструкциям CPU, а также к специальным адресам памяти.

Но в чистом C, без расширений и стандартных функций библиотеки, вы в принципе не можете ничего делать, кроме как читать аргументы командной строки, выполнять некоторую работу и возвращать код состояния из main . Этого не следует понюхать, все равно Тьюринг полностью подчиняется ограничениям ресурсов, хотя ваш единственный ресурс – это автоматические и статические переменные, без выделения кучи. Это не очень богатая среда программирования.

Стандартные библиотеки являются частью спецификации языка C, но на любом языке, как правило, существует линия, нарисованная между языком «как таковым» и библиотеками. Это принципиальная разница, но в конечном счете не очень важная в принципе, потому что в стандарте говорится, что они собрались вместе. Любой, кто делает что-то нестандартное, может так же легко удалить языковые функции, как библиотеки. В любом случае результат не соответствует реализации C.

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

Что вы можете сделать? Все!

В C нет магии, кроме, возможно, препроцессора.

Самое сложное, возможно, это написать putchar, поскольку это зависит от платформы ввода-вывода.

Это хорошая тренировка для создания собственной версии varargs, и как только вы ее получите, сделайте свою собственную версию vaprintf, затем printf и sprintf.

Я сделал все это на Macintosh в 1986 году, когда я был недоволен процедурами stdio, которые были снабжены Lightspeed C, – написал мой собственный обработчик окон с win_putchar, win_printf, in_getchar и win_scanf.

Весь этот процесс называется начальной загрузкой, и он может быть одним из самых впечатляющих примеров в кодировании – работа с базовым дизайном, который дает массу практического смысла.

Вы, конечно же, не обязаны использовать стандартные библиотеки, если у вас нет необходимости в них. Довольно много встроенных систем либо не имеют стандартной поддержки библиотеки, либо не могут использовать ее по той или иной причине. Стандарт даже конкретно говорит о реализации без поддержки библиотеки, стандарт C99 5.1.2.1 «Свободная среда»:

В автономной среде (в которой выполнение программы C может иметь место без какой-либо выгоды от операционной системы), имя и тип функции, вызываемой при запуске программы, определяются в соответствии с реализацией. Любые библиотечные средства, доступные для автономной программы, отличные от минимального набора, требуемого в соответствии с разделом 4, определяются реализацией.

Заголовки, требуемые C99, доступны в автономном исполнении: , , , , , и . Эти заголовки определяют только типы и macros, поэтому нет необходимости поддерживать библиотеку функций.

Без стандартной библиотеки вы полностью зависите от своего собственного кода, любых нестандартных библиотек, которые могут быть доступны вам, и любых системных вызовов операционной системы, с которыми вы могли бы взаимодействовать (что может считаться нестандартной библиотекой звонки). Вполне возможно, вам придется иметь подпрограммы сборки вызова программы C для взаимодействия с устройствами и / или любой другой операционной системой, которая может находиться на платформе.

Что делать, если нет printf (), fopen () и т. Д.?

Пока вы знаете, как взаимодействовать с системой, которую вы используете, вы можете жить без стандартной библиотеки C. Во встроенных системах, где у вас всего несколько килобайт памяти, вы, вероятно, вообще не хотите использовать стандартную библиотеку.

Вот Hello World! пример в Linux и Windows без использования каких-либо стандартных функций C:

Например, в Linux вы можете вызывать системные вызовы Linux непосредственно в встроенной сборке:

 /* 64 bit linux. */ #define SYSCALL_EXIT 60 #define SYSCALL_WRITE 1 void sys_exit(int error_code) { asm volatile ( "syscall" : : "a"(SYSCALL_EXIT), "D"(error_code) : "rcx", "r11", "memory" ); } int sys_write(unsigned fd, const char *buf, unsigned count) { unsigned ret; asm volatile ( "syscall" : "=a"(ret) : "a"(SYSCALL_WRITE), "D"(fd), "S"(buf), "d"(count) : "rcx", "r11", "memory" ); return ret; } int _start() { const char hwText[] = "Hello world!\n"; sys_write(1, hwText, sizeof(hwText)); sys_exit(12); return 0; } 

Скомпилируйте это с помощью:

 gcc -nostdlib nostd.c 

И он выводит Hello world! , и выходы.

В Windows системные вызовы не публикуются, а скрываются за другим уровнем абстракции – kernel32.dll. Это всегда загружается, когда ваша программа запускается независимо от того, хотите вы этого или нет. Таким образом, вы можете просто включить windows.h и использовать Win32 API:

 #include  int _start() { const char str[] = "Hello world!\n"; HANDLE stdout = GetStdHandle(STD_OUTPUT_HANDLE); DWORD written; WriteFile(stdout, str, sizeof(str), &written, NULL); ExitProcess(12); return 0; } 

windows.h имеет ничего общего со стандартной библиотекой C, так как вы также сможете писать программы Windows на любом другом языке.

Вы можете скомпилировать его с помощью инструментов MinGW, например:

 gcc -nostdlib C:\Windows\System32\kernel32.dll nostdlib.c 

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

Если вы разбираете программу, вы можете видеть только ваш код, там нет стандартной библиотеки.

Таким образом, вы можете использовать C без стандартной библиотеки.

Вы не можете много сделать, поскольку большинство стандартных функций библиотеки зависят от системных вызовов; вы ограничены тем, что вы можете делать со встроенными ключевыми словами и операторами C. Это также зависит от системы; в некоторых системах вы можете манипулировать битами таким образом, который приводит к некоторым внешним функциям, но скорее всего это скорее исключение, чем правило.

Однако элегантность C в его простоте. В отличие от Fortran, который включает в себя большую функциональность как часть языка, C вполне зависит от его библиотеки. Это дает ему большую гибкость, за счет того, что он несколько менее согласован с платформы на платформу.

Это хорошо работает, например, в операционной системе, где реализованы полностью отдельные «библиотеки», чтобы обеспечить аналогичную функциональность с реализацией внутри самого ядра.

Некоторые части библиотек указаны как часть ANSI C; они, я полагаю, являются частью языка, но не в его основе.

Ни один из них не является частью языковых ключевых слов. Однако все дистрибутивы C должны включать реализацию этих библиотек. Это обеспечивает переносимость многих программ.

Прежде всего, вы могли бы теоретически реализовать все эти функции самостоятельно, используя комбинацию C и сборки, так что теоретически вы могли бы что-либо сделать.

С практической точки зрения, библиотечные функции в первую очередь предназначены для того, чтобы спасти вас от работы по переосмыслению колеса. Некоторые вещи (например, строковые и библиотечные функции) легче реализовать. Другие вещи (например, I / O) очень сильно зависят от операционной системы. Написание собственной версии возможно для одного O / S, но это сделает программу менее переносимой.

Но вы можете писать программы, которые делают много полезных вещей (например, вычисляют PI или смысл жизни или имитируют автоматы). Однако, если вы напрямую не использовали ОС для ввода-вывода, было бы очень сложно наблюдать, что такое выход.

В повседневном программировании успех языка программирования обычно требует наличия полезной высококачественной стандартной библиотеки и библиотек для многих полезных задач. Они могут быть сторонними или сторонними, но они должны быть там.

Библиотеки std являются «стандартными» библиотеками, поскольку для компилятора C, совместимого со стандартом (например, C99), эти библиотеки должны быть «include-able». Для интересного примера, который может помочь понять, что это значит, взгляните на вызов Джессики Маккеллар здесь:

http://blog.ksplice.com/2010/03/libc-free-world/

CRT является частью языка C так же, как ключевые слова и синтаксис. Если вы используете C, ваш компилятор ДОЛЖЕН предоставить реализацию вашей целевой платформы.

Изменить: это то же самое, что и STL для C ++. Все языки имеют стандартную библиотеку. Может быть, ассемблер как исключение, или некоторые другие языки с очень низким уровнем. Но большинство средних / высоких уровней имеют стандартные библиотеки.

Стандартная библиотека C является частью ANSI C89 / ISO C90. Недавно я работал над библиотекой для компилятора C, который ранее не был ANSI-совместимым.

Книга The Standard C Library от PJ Plauger была отличной ссылкой для этого проекта. В дополнение к написанию требований стандарта Plauger объясняет историю каждого файла .h и причины, лежащие в основе дизайна API. Он также обеспечивает полную реализацию библиотеки, что очень помогло мне, когда что-то в стандарте было непонятным.

Стандарт описывает macros, типы и функции для каждого из 15 файлов заголовков (включая stdio.h, stdlib.h, но также float.h, limits.h, math.h, locale.h и т. Д.).

Компилятор не может претендовать на ANSI C, если он не включает стандартную библиотеку.