Можете ли вы определить main () для приема более чем аргументов argc / argv?

0

Можете ли вы определить main() для принятия нескольких аргументов, например:

int main(int argc1, int argc2, char* argv1[], int* argv2[])
  • 0
    Какими должны быть эти дополнительные аргументы? Откуда они?
  • 0
    Да, это возможно, но ваша программа больше не будет стандартной. Вам нужно будет изменить часть ОС, которая вызывает ваш main а также изменить компилятор для принятия вашего нового синтаксиса. Большинство операционных систем уже имеют соглашение о передаче аргументов командной строки в исполняемый файл.
Показать ещё 3 комментария
Теги:

4 ответа

7
Лучший ответ

В 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).

  • 0
    Хороший ответ. Примечание: envp[] , как правило, NULL , -завершённый массив.
1

Ваш компилятор получает решение о том, какие подписи (и тип возврата) main разрешены, и каково поведение программы для каждого из них. Проконсультируйтесь с его документацией, чтобы узнать об этом.

Единственными сигнатурами, которые должны поддерживать все компиляторы, являются две стандартные (и эквивалентные):

int main(void)
int main(int, char **)
1

[Basic.start.main]/2:

Реализация не должна предопределять main функцию. Эта функция не должна быть перегружена. Он должен иметь объявленный тип возвращаемого типа типа int, но в противном случае его тип определяется реализацией. Реализация должна

  • функция(), возвращающая int и
  • функция (int, указатель на указатель на char) возвращающий int

как тип main (8.3.5).

Реализация может теоретически разрешить подпись, упомянутую в вопросе, - но это было бы совершенно бессмысленно, и кажется, что соответствующий компилятор не поддерживает ее. (Что бы это пропустило?)

Хотя есть определенные main подписи, которые действительно поддерживаются и не охватываются стандартом, например:

int main( int, char**, char** )
0

Да, вы можете иметь подпись main функции любым способом, которым вы ее хотите; но он не будет стандартным.

Вам нужно будет изменить компилятор, чтобы принять новое объявление. И испустите правильный код для него.

Возможно, вам придется изменить операционную систему, чтобы правильно передать аргументы пользователя в вашу программу.

Опять же, да, возможны и другие объявления, но они не будут стандартными и требуют изменений в ОС и цепочке инструментов.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню