В начале было слово. И слово было... «Hello, World!»
Нет, ну правда, сколько было куроводств с первым примером кода – вывести "Hello world!" на консоль!
#include <stdio.h>
int main(void) {
printf("Hello world");
return 0;
}
– вот как-то так.
И, к слову, это "проклятье" тянется как раз с книги K&R "The C Programming Language". Загуглите – приятная книжка, прямо от авторов языка!
Тогда почему же мы начали со сложнейшей утилиты для Unix-like ОС, вместо простого "Hello world"?..
А чё такое "#include"? Рад, что ты спросил! Ведь за этим кроется просто бездна информации, отдельный язык программирования и целый препроцессор!
Про то, на сколько замечательный printf, я, скорее всего не расскажу в рамках этой книжки.
Препроцессор Си
Невероятно, но факт – Ритчи и Керниган придумали язык над языком. Ещё до того, как компилятор начинает собирать код Си, запускается препроцессор, в задачах которого:
- замена соответствующих диграфов и триграфов на эквивалентные символы «#» и «\»;
- удаление экранированных символов перевода строки;
- замена строчных и блочных комментариев пустыми строками (с удалением окружающих пробелов и символов табуляции);
- вставка (включение) содержимого произвольного файла (#include);
- макроподстановки (#define);
- условная компиляция (#if, #ifdef, #elif, #else, #endif);
- вывод сообщений (#warning, #error).
И скептик бы сказал, что это очередной костыль, чтобы это всё заработало, когда
стало большим... Так и есть! Однако именно благодаря препроцессору мы можем
подключить заголовочный файл работы с вводом-выводом (stdio.h
) и использовать
printf
.
К счастью, тогда костыли были зеленее, а небо голубее...
#include <stdio.h>
Как раз этой командой препроцессору мы говорим подключить заголовочный файл
stdio.h
для того, чтобы мы могли использовать функции (определённые в нём).
Например, оттуда мы можем получить printf
– уже знакомый вам по курсу ОС
(примечание для моих студентов, либо же вы можете найти этот курс на 900913.ru).
Также там есть функция puts
– положить строку на стандартный вывод.
Препроцессор Си – одно из средств упростить разработку на Си. Мы часто будем прибегать к нему. И рассмотрим подробнее позднее. А также напишем свои макросы и header файлы.
И всё же "Hello world"
Традиционный (со времён K&R) стартовый пример кода:
#include <stdio.h>
int main(void) {
puts("Hello world");
return 0;
}
Что происходит:
- В теле функции (внутри фигурных скобок):
- Кладём строку на стандартный вывод (
puts
). Параметром идёт строка, которую хотим вывести. - Возвращаем из функции 0. Для функции main – это код возврата команды (errorlevel / $?).
- Кладём строку на стандартный вывод (
Собираем, запускаем:
→ clang hello-world.c -o hello_world
→ ./hello_world
Hello world
Вот и мы научились великому навыку писать "привет мир"!