Несимметрия между основным процессом и процессом запуска - PullRequest
0 голосов
/ 25 апреля 2018

Основной метод C имеет подпись

int main(int argc, char** argv) {
}

Получит массив параметров командной строки. Но при попытке запустить приложение, например, используя CreateProcess или ShellExecute , они принимают только 2 параметра: один для запуска приложения и один для параметров. Почему параметры также не указаны в виде массива? Почему каждое приложение, которое использует другие приложения, имеет дело с экранированием параметров командной строки, например, при вызове инструмента сравнения с 2 произвольными именами файлов, которые могут содержать пробелы или цитаты?

1 Ответ

0 голосов
/ 25 апреля 2018

В очень немногих системах фактическое выполнение программы фактически начинается с main (или WinMain) или аналогичной функции. Вместо этого компилятор говорит компоновщику использовать специальную функцию, которая обычно не принимает каких-либо аргументов в смысле слова на языке С.

Аргументы командной строки (если любой ) могут быть переданы через специальные регистры на уровне сборки, или они должны быть извлечены с использованием специальных функций, специфичных для ОС (например, GetCommandLine в Windows API).

В Windows функция GetCommandLine действительно получает командную строку в виде одной строки. Так же, как это было передано, например, CreateProcess.

Для консольной программы Windows специальная функция «entry» выполняет некоторую другую инициализацию (например, установку stdin и т. Д.), А затем вызывает GetCommandLine, чтобы получить аргументы командной строки, который затем анализируется в массив, подходящий для функции main, которая затем вызывается.


Если вы посмотрите на мир POSIX (где, например, Linux и macOS), то у них есть семейство функций exec , которое действительно принимает массив для аргументов. Или список переменных-аргументов, который разбирается в такой массив.

...