В очень немногих системах фактическое выполнение программы фактически начинается с main
(или WinMain
) или аналогичной функции. Вместо этого компилятор говорит компоновщику использовать специальную функцию, которая обычно не принимает каких-либо аргументов в смысле слова на языке С.
Аргументы командной строки (если любой ) могут быть переданы через специальные регистры на уровне сборки, или они должны быть извлечены с использованием специальных функций, специфичных для ОС (например, GetCommandLine
в Windows API).
В Windows функция GetCommandLine
действительно получает командную строку в виде одной строки. Так же, как это было передано, например, CreateProcess
.
Для консольной программы Windows специальная функция «entry» выполняет некоторую другую инициализацию (например, установку stdin
и т. Д.), А затем вызывает GetCommandLine
, чтобы получить аргументы командной строки, который затем анализируется в массив, подходящий для функции main
, которая затем вызывается.
Если вы посмотрите на мир POSIX (где, например, Linux и macOS), то у них есть семейство функций exec
, которое действительно принимает массив для аргументов. Или список переменных-аргументов, который разбирается в такой массив.