Каковы действительные подписи для основного C () функция?

Каковы действительно действительные подписи для основной функции в C? Я знаю:

int main(int argc, char *argv[])

Есть ли другие допустимые?

58
задан Solomon Ucko 17 March 2019 в 17:28
поделиться

4 ответа

Пакеты Java не вложены, они плоские. Любое явное гнездование - не что иное, как Конвенция об именах.

Например, пакет com.company.project.db не имеет отношения к com.company.project или com.company.project.db.x . Код в com.company.project.db не имеет больше доступа к коду в com.company.project.db.x , чем был бы код в A.B.C .

-121--1212847-

Стандарт C11 C11 стандартный явно упоминает эти два:

int main(void);
int main(int argc, char* argv[]);

, хотя он упоминает фразу «или эквивалент» со следующей сносками:

Таким образом, INT может быть заменена на имя Typedef , определяемое как int , или тип ARGV может быть записан как CHAR ** ARGV и так далее.

Кроме того, он также предусматривает больше (определенные реализации) возможности.

Соответствующий текст (раздел 5.1.2.2.1 , но этот конкретный аспект неизменен из C99 ) состояний:

Функция, называемая при запуске программы Главная . Реализация не объявляет прототипа для этой функции. Он должен быть определен с возвратным типом INT и без параметров:

 int Main (void) {/ * ... * /}
 

Или с двумя параметрами (упомянуты здесь как ARGC и , хотя любые имена могут быть использованы, поскольку они являются локальными к функции, в которой они объявлены):

 INT MAIN (INT ARGC, CHAR * ARGV []) {/ * ... * /}
 

или эквивалент; или в некоторой другой степени определен в реализации.

Если они будут объявлены, параметры к функции Главная должны подчиняться следующим ограничениям:

  • Значение ARGC должно быть неотрицательным.

  • ARGV [ARGC] должен быть нулевым указателем.

  • Если значение ARGC больше нуля, элементы массива ARGV [0] через ARGV [ARGC-1] включительно должны содержать указатели на Строки, которые дают определенные внедрение значений в условиях хоста до запуска программы. Намерение состоит в том, чтобы поставить на информацию о программе определенной до запуска программы из других стран в размещенной среде. Если хост-среда не способна поставлять строки буквами как в верхнем регистре, так и в нижнем регистре, реализация должна обеспечить, чтобы строки были получены в нижнем регистре.

  • Если значение ARGC больше нуля, строка, указанная на ARGV [0] , представляет имя программы; ARGV [0] [0] должен быть нулевым символом, если имя программы недоступно в хост-среде. Если значение ARGC превышает один, строки, указанные на [1] ARGV [1] через ARGV [ARGC-1] , представляют параметры программы.

  • Параметры ARGC и ARGV и струны, указанные на массиве ARGV , должны быть модифицируемыми программой и сохраняют свои последние сохраненные значения между Запуск программы и завершение программы.

Обратите внимание, что это для размещенной среды, те, которые вы обычно видите в C программ. Окружающая среда (например, встроенная система) гораздо менее ограничена, как указано в 5.1.2.1 того же стандарта:

в отдельно стоящей среде (в которой могут проходить выполнение программы C Без каких-либо пользы операционной системы) имя и тип функции, называемого при запуске программы, определены реализацией. Любые объекты библиотеки, доступные для отдельно стоящей программы, кроме минимального набора, требуемого пунктом 4, определены реализацией.

68
ответ дан 24 November 2019 в 18:55
поделиться

POSIX поддерживает execive () , которые, в свою очередь, поддерживает

int main(int argc, char *argv[], char *envp[])

, добавленный аргумент - это среда, то есть массив строк имени формы = значение.

8
ответ дан 24 November 2019 в 18:55
поделиться

http://en.wikipedia.org/wiki/main_function_ (программирование) # c_and_c.2b.2b

, кроме обычного INT MAIN (INT ARGC, CHAR * ARGV []) и POSIX INT MAIN (INT ARGC, CHAR ** ARGV, CHAR ** ENVP) , на Mac OS X также поддерживает

int main(int argc, char* argv[], char* envp[], char* apple[]);

, конечно, это только Mac.

В окнах есть

int wmain(int argc, wchar_t* argv[], wchar_t* envp[]);

как Unicode (фактически, широко-символ) вариант. Конечно, есть WinMain тоже.

8
ответ дан 24 November 2019 в 18:55
поделиться

Вы можете иметь вложенные пространства имен в C ++.

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

-121--1212849-
int main(void)

При какой-то ОС (например, Windows) также так действителен:

int main(int argc, char **argv, char **envp)

где envp дает окружающую среду, в противном случае доступен через getenv ()

3
ответ дан 24 November 2019 в 18:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: