【问题标题】:(cpp) old conversion from constant string to char * [duplicate](cpp)从常量字符串到字符的旧转换 * [重复]
【发布时间】:2013-11-08 09:45:04
【问题描述】:

我想使用 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" .. etc 失败:

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

【问题讨论】:

标签: c++


【解决方案1】:

警告是合法的,因为将“const char*”分配给“char *”是危险的。指向的数据可以更改,但不应更改。

要使用 const char* 构建参数向量,请将数组声明为 char const * const[]

要将数组传递给 execv,请将其强制转换为 char**。

这个版本应该避免警告:

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

【讨论】:

  • "看一下execvp函数的原型"Yes please: int execv(const char *path, char *const argv[]);所以很遗憾,但 execvp 不会接受你的char const * const argVec[]
  • 我明白你的意思。你可能需要一个演员表。将编辑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-21
  • 2019-05-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多