将const char*传递给foo(char*)

Lie*_*uwe 0 c c++

虽然通过一些c ++代码作为PCI DSS认证审核的一部分,但我发现了以下内容:

我在我们使用的某个库中有一个方法,其中一个参数是char*,让我们说这是

void foo(char* arg);
Run Code Online (Sandbox Code Playgroud)

代码中调用此方法的点如下所示:

char mystring[256];
strcpy(mystring, "some value");
....
foo(mystring);
Run Code Online (Sandbox Code Playgroud)

作为评论的一部分,我们正在摆脱任何strcpy调用(尽管在这个例子中它有点微不足道,因为"某些值"明显适合mystring)

所以我们得到:

char mystring[256];
strncpy(mystring, "some value", sizeof(mystring));
mystring[sizeof(mystring)-1] = '\0';
....
foo(mystring);
Run Code Online (Sandbox Code Playgroud)

这是因为我想

foo("some value")
Run Code Online (Sandbox Code Playgroud)

会通过一个 const char *

令我惊讶的是,编译器(gcc 4)对此非常满意.当我添加-Wall或-Wcast-qual时,它甚至不会发出任何警告

我的问题是:当我不知道foo实际上在做什么(如果有的话)时,我可以安全地调用foo("某些值")吗?

Nei*_*irk 10

不,如果你不能保证foo不会修改参数,那就不安全了.编译器可以隐式地转换字符串文字以便char *与C代码向后兼容(遗憾的是).您必须将文字复制到可修改的char缓冲区并传递它.

  • 自C++ 11以来,此转换不存在.字符串文字不会转换为`char*`. (5认同)

Mik*_*our 8

在这种情况下,foo("some value")当我不知道foo它的参数究竟在做什么(如果有的话)时,我可以安全地打电话吗?

不可以.字符串文字是常量,尝试修改它会产生未定义的行为.

由于历史原因,char*有些编译器会允许转换为非const的非常规转换- 尽管从C++ 11开始转换不再有效.你不应该依赖它,希望你可以调高编译器的警告级别来防止它.

令我惊讶的是,编译器(gcc 4)对此非常满意.

这是令人惊讶的.我的GCC 4.6.3默认发出警告; 我需要指定-Wno-write-strings让它沉默.

  • 转换_was_已弃用,它在当前的C++标准中无效. (4认同)