Стандарт C11 заявляет, что:
5.1.2.2.1 Запуск программы
Функция, вызываемая при запуске программы, называется main. Реализация не объявляет прототип для этой функции. Он должен быть определен с типом возвращаемого значения
int
и без параметров:int main(void) { /* ... */ }
или с двумя параметрами (обозначаемыми здесь как
argc
иargv
, хотя могут использоваться любые имена, поскольку они являются локальными для функции, в которой они объявлены):int main(int argc, char *argv[]) { /* ... */ }
или эквивалент; 10) или каким-либо другим способом, определяемым реализацией.
10) Таким образом, int можно заменить именем
typedef
, определенным какint
, или типargv
можно записать какchar ** argv
, и так далее.
Мы проигнорируем эту часть: или каким-либо другим образом, определяемым реализацией, поскольку меня интересуют только определения, эквивалентные двум приведенным выше примерам.
Будет ли это допустимым определением для main, поскольку char* a[4]
и char**
эквивалентны:
int main(int argc, char* argv[4]){/*...*/}
Как насчет массива VLA, мы предполагаем, что printf
вернет положительное значение int:
int main(int argc, char* argv[printf("Hello there!")]){/*...*/}
argv[static 4]
. - person Grzegorz Szpetkowski   schedule 23.06.2015static
не влияет на тип. Конечно, квалификаторы типа, такие какconst
иrestrict
, которые также могут использоваться таким образом, влияют на это. - person cremno   schedule 23.06.2015