Что я могу сделать, если нет printf (), fopen () и т. Д.?
Пока вы знаете, как взаимодействовать с системой, которую вы используете, вы можете жить без стандартной библиотеки C. Во встроенных системах, где у вас всего несколько килобайт памяти, вы, вероятно, вообще не хотите использовать стандартную библиотеку.
Это Привет, Мир! пример на 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 <windows.h>
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 без стандартной библиотеки.