警告:ISO C++ 禁止将字符串常量转换为 'char*' [-Wwrite-strings]

rea*_*nno 23 c++ warnings

非常简单的代码确实警告了我。有些提示没有建设性。警告是:

ISO C++ 禁止将字符串常量转换为 'char*' [-Wwrite-strings]

我试过:

char const *q = "pin";
char const *r = "\n\r";
{
while(client.findUntil(*q, *r)) 
Run Code Online (Sandbox Code Playgroud)

没有成功

原产地代码:

while(client.findUntil("pin", "\n\r"))
Run Code Online (Sandbox Code Playgroud)

eer*_*ika 15

ISO C++ 禁止将字符串常量转换为 'char*' [-Wwrite-strings]

while(client.findUntil("pin", "\n\r"))
Run Code Online (Sandbox Code Playgroud)

警告意味着您的程序格式错误。您没有显示声明,但从上下文中,我们可以推断出 的参数findUntilchar*。您不能将字符串文字传递给此类函数。

char*在 C++11 之前,它曾经是格式良好的 - 但不推荐使用 - 传递字符串文字。

我试过:

char const *q = "pin";
char const *r = "\n\r";
Run Code Online (Sandbox Code Playgroud)

这些本身是正确的,但是

while(client.findUntil(*q, *r)) 
Run Code Online (Sandbox Code Playgroud)

这没有任何意义。以前您试图传递一个字符串,但现在您通过字符指针间接传递,因此您正在传递一个字符。除非函数是模板,否则这不可能工作。

findUntil(q, r) 也不会工作,因为指向 const 的指针不会隐式转换为指向非常量的指针。

正确的解决方案是将字符串文字复制到可修改的数组中:

char q[] = "pin";
char r[] = "\n\r";
{
    while(client.findUntil(q, r)) 
Run Code Online (Sandbox Code Playgroud)

另一个是修复findUntil接受指向 const char 的指针。然后您可以使用字符串文字,因为它们可以转换为指向 const char 的指针。

  • 我用以下代码解决了它:`char* q = (char*)"pin";` `char* r = (char*)"\n\r";` `... while(client.findUntil(q, r); ...` (8认同)
  • @realhanno 这有点危险,除非您确切知道函数“findUntil”的作用,特别是知道它不会修改参数指向的字符串。修复“findUntil”以使用指向 const char 的指针是更好的解决方案。 (5认同)