1

execev 関数を使用して、別のプログラムのフォークから texwork プログラムを実行したいので、次のように設定します。

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";

つまり、警告、文字列定数から char* への古い変換 (argVec[0] に対する同じ警告)

心配する必要がありますか?もしそうなら、どうすればこれを回避できますか?

(ああ、私は Linux、64 ビット、g++ 4.8.1 -2013 プレリリース、および const char* argVec[] = {"texworks" .. などで失敗します:

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};
4

1 に答える 1

3

「const char*」を「char *」に割り当てることは危険であるため、警告は正当です。指し示すデータは変更できますが、変更すべきではありません。

const char* を使用して引数ベクトルを作成するには、配列を char const * const[] として宣言します。

配列を execv に渡すには、char** にキャストします。

このバージョンでは、次の警告を回避する必要があります。

char const * const argVec[] = {
  "texworks"
, "temp.tex"
, NULL
};
execvp("texworks", (char**)argVec);
于 2013-11-08T09:53:58.897 に答える