Можете ли вы определить main() для принятия нескольких аргументов, например:
int main(int argc1, int argc2, char* argv1[], int* argv2[])
В C единственными переносимыми определениями для main
являются:
int main(void) { /* ... */ }
а также
int main(int argc, char *argv[]) { /* ... */ }
или эквивалент. Другие формы, определенные для реализации, разрешены, но, как предполагает термин "реализация", они разрешены только в том случае, если ваш компилятор решает разрешить их.
Существуют некоторые распространенные расширения, такие как:
int main(int argc, char *argv[], char *envp[]) { /* ... */ }
но я сомневаюсь, что любой компилятор поддерживает конкретную форму, которую вы предлагаете. Я не уверен, как это было бы полезно; существующая форма argc
/argv
допускает произвольное количество аргументов командной строки.
C++ немного отличается от C тем, что для типа возврата требуется int
; в C, компилятор может, но не обязательно, разрешать другие типы возврата. Кроме того, в C++ ()
означает, что функция не имеет параметров, эквивалентных C (void)
. (C++ также разрешает (void)
для совместимости с C).
envp[]
, как правило, NULL
, -завершённый массив.
Ваш компилятор получает решение о том, какие подписи (и тип возврата) main
разрешены, и каково поведение программы для каждого из них. Проконсультируйтесь с его документацией, чтобы узнать об этом.
Единственными сигнатурами, которые должны поддерживать все компиляторы, являются две стандартные (и эквивалентные):
int main(void)
int main(int, char **)
[Basic.start.main]/2:
Реализация не должна предопределять
main
функцию. Эта функция не должна быть перегружена. Он должен иметь объявленный тип возвращаемого типа типа int, но в противном случае его тип определяется реализацией. Реализация должна
- функция(), возвращающая
int
и- функция
(int
, указатель на указатель наchar)
возвращающийint
как тип
main
(8.3.5).
Реализация может теоретически разрешить подпись, упомянутую в вопросе, - но это было бы совершенно бессмысленно, и кажется, что соответствующий компилятор не поддерживает ее. (Что бы это пропустило?)
Хотя есть определенные main
подписи, которые действительно поддерживаются и не охватываются стандартом, например:
int main( int, char**, char** )
Да, вы можете иметь подпись main
функции любым способом, которым вы ее хотите; но он не будет стандартным.
Вам нужно будет изменить компилятор, чтобы принять новое объявление. И испустите правильный код для него.
Возможно, вам придется изменить операционную систему, чтобы правильно передать аргументы пользователя в вашу программу.
Опять же, да, возможны и другие объявления, но они не будут стандартными и требуют изменений в ОС и цепочке инструментов.
main
а также изменить компилятор для принятия вашего нового синтаксиса. Большинство операционных систем уже имеют соглашение о передаче аргументов командной строки в исполняемый файл.