Конвенция по основным аргументам

Из-за ограничений IDE-кода я всегда писал свою основную функцию так:

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

Но в IDE, где вас начинают со структуры приложения hello world type, чтобы начать вас, я видел, что она написана по-разному. Например, в XCode это argv в качестве константы:

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

Я также видел, как люди объявляют argv[] как двойной указатель, и я не могу понять причину:

int main(int argc, char** argv)

Есть ли какой-либо стандарт или соглашение, как это объявлено? Должен ли я иметь двойной указатель или константу?

Дополнительный вопрос: должна ли звездочка, обозначающая указатель, помещаться сразу после типа данных, непосредственно перед именем переменной или разделяться посередине?

2 ответа

Решение

Есть ли какой-либо стандарт или соглашение, как это объявлено? Должен ли я иметь двойной указатель или константу?

Это четко определено в Стандарте C++.

Ссылка:
C++ 03 Раздел § 3.6.1:

Параграф 2:

Он должен иметь возвращаемый тип int, но в остальном его тип определяется реализацией. Все реализации должны позволять оба следующих определения main:

int main() { /* … */ }

and 

int main(int argc, char* argv[]) { /* … */ }

В последней форме argc будет количеством аргументов, переданных программе из среды, в которой она запущена. Если argc отлично от нуля, эти аргументы должны быть переданы inargv[0] через argv[argc-1] как указатели на начальные символы многобайтовых строк с нулевым символом в конце (NTMBS) (17.3.2.1.3.2), и argv [0] должен быть указатель на начальный символ NTMBS, который представляет имя, используемое для вызова программы или "". Значение argc должно быть неотрицательным. Значение argv[argc] должно быть 0. [Примечание: рекомендуется добавлять любые дополнительные (необязательные) параметры после argv]

Я полагаю, что различные стандарты говорят, что argv НЕ является const. Теперь, если ваше приложение не изменяет argv, нет причины, по которой вы не можете объявить его const.

Другие вопросы по тегам