2013-11-08 3 views
1

Я хочу использовать функцию execev для запуска программы Texwork от развилки другой программы, и, следовательно, у меня есть следующие настройки:(CPP) старое преобразование из константной строки на символ *

char *argVec[3]; 
argVec[0] = "texworks"; 
argVec[1] = "temp.tex"; 
argVec[2] = NULL; 
execvp("texworks", argVec); 

его работает, но предупреждает меня:

Warnung: veraltete Konvertierung von Zeichenkettenkonstante in »char*« [-Wwrite-strings] 
    argVec[1] = "temp.tex"; 

что: предупреждение, старое преобразование из строки постоянной на символ * (тот же warnign для argVec [0])

я должен волноваться, и если да, то как я избегаю t его?

(ой, я в Linux, 64 бит, г ++ 4.8.1 -2013 пререлиз и Const символ * argVec [] = { "TEXworks" .. и т.д. failes с этим:

Fehler: ungültige Umwandlung von »const char**« in »char* const*« [-fpermissive] 
    execvp("texworks", argVec); 
         ^
In file included from path/to/file: 
/usr/include/unistd.h:578:12: Fehler: Argument 2 von »int execvp(const char*, char* const*)« wird initialisiert [-fpermissive] 
extern int execvp (const char *__file, char *const __argv[]) 
     ^
/path/to/file:cursor:position: Fehler: Sprung zur case-Marke [-fpermissive] 
    default: 
^
/path/to/file:cursor:position:: Fehler: überschneidet Initialisierung von »const char* argVec [3]« 
    const char * argVec[] = {"texworks" , "temp.tex", NULL}; 
+0

Как, вы массив может быть массивом сопзИте полукокс *. Может быть, это то, что имеется в виду, потому что вы в основном накладываете const на не-const здесь неявно. – nvoigt

+0

['execvp'] (http://linux.die.net/man/3/execvp) запрашивает' char * const argv [] 'для второго параметра, поэтому, возможно, используйте объявление, соответствующее требованиям, чтобы избежать предупреждения. – WhozCraig

+0

См. Также http://stackoverflow.com/questions/190184/execv-and-const-ness, http://stackoverflow.com/questions/10456043/why-is-argv-parameter-to-execvp-not-const или http://stackoverflow.com/questions/19505360/why-does-execvp-take-a-char-const-argv –

ответ

3

предупреждение является законным, потому что назначение «const char *» в «char *» является опасным. Указанные данные могут быть изменены, но это не должно.

Чтобы построить вектор аргументов, используя const char *, объявить массив в виде char const * const []

Чтобы передать массив execv, нарисуйте его на char **.

Эта версия должна избежать предупреждения:

char const * const argVec[] = { 
    "texworks" 
, "temp.tex" 
, NULL 
}; 
execvp("texworks", (char**)argVec); 
+1

«Посмотрите на прототип функции execvp» [Да, пожалуйста] (http: // linux. die.net/man/3/execvp): int execv (const char \ * path, ** char ** \ * const argv []); так что это позор, но execvp не примет ваш 'char const * const argVec []' –

+0

Я вижу вашу точку. Вам, вероятно, понадобится бросок. Будет редактировать. – Pat

Смежные вопросы