В прерыдущем примере мы использовали очень простую программу:
#include <stdio.h> main () { printf("Hello, world\n"); }
Содержание
Код завершения
Давайте дополним её код:
#include <stdio.h> int main (int argc, char **argv) { printf("Hello, world\n"); return 0; }
Компилируем, проверяем:
[simterm]
$ gcc hello2.c -o hello2 $ ./hello2 Hello, world
[/simterm]
Первая строка у нас остаётся без изменений — тот же шебанг с командой для препроцессора, которая указывает ему загрузить файл stdio.h
перед тем, как передавать код на обработку компилятору:
#include <stdio.h>
А вот описание функции main()
выглядит иначе — тут мы указываем int
перед именем функции:
... int main () ...
Что означает, что фукнция main()
вернёт целочисленное значение (мы рассмотрим типы данных в С позже):
... return 0; ...
В С — каждая функция возращает какое-то значение, тип которого и указывается перед именем функции.
Т.к. main()
у нас возвращает 0 (return 0
) — то и тип возвращаемого значения мы указываем int
(integer):
... int main () ...
В результате — если программа (функция) завершает выполнение успешно — она вернёт 0, в противном случае — любое другое значение, которое будет сигнализировать об ошибке во время выполнения.
Проверить код завершения выполнения можно с помощью $?
:
[simterm]
$ ./hello2 Hello, world $ echo $? 0
[/simterm]
Например — можно изменить код на:
... printf("Hello, world\n"); return -1; ...
Компилируем и проверяем:
[simterm]
$ ./hello2 && echo OK: $? || echo ERROR: $? Hello, world ERROR: 255
[/simterm]
Примечание: в ответе значение 255, а не -1 — т.к. bash
и POSIX стандарт используют в ошибке беззнаковые значения от 1 до 255, а -1 в двоичном равно 11111111, что в десятичном == 255.
Аргументы
Далее — функция main()
может принимать два аргумента:
... ... (int argc, char **argv) ...
Первый аргумент — argc
— имеет тот же тип integer, и содержит в себе количество аргументов, переданных функции или программе.
Второй аргумент — argv
— является указателем (мы обсудим их далее) на charachter (символьный) массив данных.
Его так же можно записать как char *argv[]
.
Быстро проверим — выведем значения argc
и argv
на экран с помощь printf()
— усложним программу:
#include <stdio.h> int main (int argc, char **argv) { printf("Hello, world\n"); printf("Argc: %d\n", argc); int i; for (i = 0; i < argc; i++) { printf("Argv[%d]: %s\n", i, argv[i]); } return 0; }
Результат её выполнения:
[simterm]
$ ./hello2 one two three Hello, world Argc: 4 Argv[0]: ./hello2 Argv[1]: one Argv[2]: two Argv[3]: three
[/simterm]
Т.е. — argc
содержит число 4 — кол-во аргументов вообще (включая имя программы), а argv
— содержит все аргументы, переданные программме, включая её имя в первом элементе массива (argv[0]
).
Продолжение — C programming для начинающих: часть 3 — передача аргументов программе.