Каковы действительно действительные подписи для основной функции в C? Я знаю:
int main(int argc, char *argv[])
Есть ли другие допустимые?
Пакеты 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
.
Стандарт 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, определены реализацией.
POSIX поддерживает execive ()
, которые, в свою очередь, поддерживает
int main(int argc, char *argv[], char *envp[])
, добавленный аргумент - это среда, то есть массив строк имени формы = значение.
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
тоже.
Вы можете иметь вложенные пространства имен в C ++.
Они не работают так же, как в Java, хотя, очевидно,. Пакеты Java действительно намного лучше определены, и нет реальной статической инициализации странности. С пространствами имен C ++ полезны, но все равно есть справедливый случай опасности.
-121--1212849-int main(void)
При какой-то ОС (например, Windows) также так действителен:
int main(int argc, char **argv, char **envp)
где envp
дает окружающую среду, в противном случае доступен через getenv ()