Определение собственных основных аргументов функций argc и argv

В Firefox перейдите к Файлу => Установка Страницы. Существует флажок для "Фона печати (окрашивает & изображения)". Просто проверьте, что и Вы должны быть все установлены.

24
задан Kirill V. Lyadvinsky 5 October 2009 в 18:48
поделиться

6 ответов

Быстро и грязно, но работает для QApplication :

char *argv[] = {"program name", "arg1", "arg2", NULL};
int argc = sizeof(argv) / sizeof(char*) - 1;

Для более полного и соответствующего стандарту C решения см. ответ Д.Шоули .

Почему ваше решение не работает, очень просто:

array [i] [j] дает матрицу i * j . Но на самом деле вам нужен массив с указателями на строки в нем.

37
ответ дан 28 November 2019 в 22:26
поделиться

Если вы хотите быть безумно безрассудным, вам нужно что-то вроде следующего. Ключевыми моментами являются то, что argv не является const , argv равно NULL завершено, argc является числом используемые элементы в argv , включая имя программы . Он должен быть изменяемым, чтобы вы не могли использовать строковые литералы - argv [i] требуется для указания на изменяемый массив символов.

int my_main() {
    char  arg0[] = "programName";
    char  arg1[] = "arg";
    char  arg2[] = "another arg";
    char* argv[] = { &arg0[0], &arg1[0], &arg2[0], NULL };
    int   argc   = (int)(sizeof(argv) / sizeof(argv[0])) - 1;

    QApplication the_application(argc, &argv[0]);
    return the_application.run();
}

Стандарт (ISO / IEC 9899: 1999, раздел 5.1.2.2) .1) утверждает, что следующее верно для argc и argv в размещенной среде:

  • Значение argc должно быть неотрицательным.
  • argv [argc] должен быть нулевым указателем.
  • Если значение argc больше нуля, члены массива с argv [0] по argv [argc-1] включительно должны содержать указатели на строки, которым среда хоста присваивает значения, определяемые реализацией, до запуска программы из другого места в размещенной среде. Если среда хоста не способна предоставлять строки с буквами как в верхнем, так и в нижнем регистре, реализация должна гарантировать, что строки принимаются в нижнем регистре.
  • Если значение argc больше нуля, строка, на которую указывает argv [0] , представляет имя программы ; argv [0] [0] должен быть нулевым символом, если имя программы недоступно из среды хоста. Если значение argc больше единицы, весь срок службы QApplication объект. Кроме того, argc должен быть больше нуля и argv должен содержать хотя бы один допустимый символ строка.

    Примечание: argc и argv могут быть изменены поскольку Qt удаляет аргументы командной строки

33
ответ дан 28 November 2019 в 22:26
поделиться

Как насчет ...

int argc = 2;
const char* argv[] ={"program","first-argument"}; 

... или если вам нужно, чтобы они были неконстантными ...

int argc = 2;
char* argv[] ={strdup("program"),strdup("first-argument")}; 
3
ответ дан 28 November 2019 в 22:26
поделиться

Почему вас беспокоит размер текста в argv, я бы просто позволил компилятору сделать это:

int argc = 1;
char* argv[] = {"Hello Qt!"}; // exactly as it is defined in main
3
ответ дан 28 November 2019 в 22:26
поделиться

Хотя ни стандарты C, ни C ++ этого не требуют, большинство компиляторов делают аргументы для main доступными для вас как _argv и _argc. Если память не изменяет, этого требует POSIX. В любом случае, вам нужно использовать что-то вроде:

extern int _argc;
extern char *_argv[];

и оттуда вы можете использовать их как обычно.

0
ответ дан 28 November 2019 в 22:26
поделиться

Надеюсь, это сработает:

char* argv[1];
argv[0] = "cgalExample";
-2
ответ дан 28 November 2019 в 22:26
поделиться
Другие вопросы по тегам:

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