В последней версии стандарта C (N1256) говорится, что есть две допустимые формы функции main
:
int main (void);
int main (int argc, char* argv[]);
но суть - это пункт "или каким-либо другим образом, определяемым реализацией". Мне кажется, это стандартная лазейка, достаточно большая, чтобы проехать полуприцеп.
Некоторые люди специально используют "const char *"
для argv
, чтобы запретить изменение аргументов. Если ваша основная функция определена таким образом, вам не разрешено изменять символы, на которые указывает argv[]
, о чем свидетельствует следующая программа:
pax> cat qq.c
#include <stdio.h>
int main (int c, const char *v[]) {
*v[1] = 'X';
printf ("[%s]\n", v[1]);
return 0;
}
pax> gcc -o qq qq.c
qq.c: In function `main':
qq.c:3: error: assignment of read-only location
Однако, если вы удалите "const"
, он будет работать нормально:
pax> cat qq2.c
#include <stdio.h>
int main (int c, char *v[]) {
*v[1] = 'X';
printf ("[%s]\n", v[1]);
return 0;
}
pax> gcc -o qq2 qq2.c ; ./qq2
[Xello]
Я думаю, что это также относится и к C ++. Текущий проект гласит:
All implementations shall allow both of the following definitions of main:
int main();
int main(int argc, char* argv[]);
, но он не запрещает другие варианты, так что вы, вероятно, можете принять версию "const"
также на C ++ (и, фактически, g ++ это делает).
Единственное, с чем вам нужно быть осторожным, это пытаться увеличить размер любого из элементов. Стандарты не предписывают, как они хранятся, поэтому расширение одного аргумента может (вероятно, повлияет) на другие или некоторые другие несвязанные данные.