我正在处理一个非常大的代码库,最近升级到GCC 4.3,现在触发了这个警告:

警告:不赞成将字符串常量转换为' char* '

显然,解决这个问题的正确方法是找到每一个声明

char *s = "constant string";

或者像这样调用函数:

void foo(char *s);
foo("constant string");

让它们成为const char指针。但是,这意味着至少要接触564个文件,这不是我目前希望执行的任务。现在的问题是我正在使用-Werror运行,所以我需要一些方法来抑制这些警告。我该怎么做呢?


当前回答

我也遇到过类似的问题,我是这样解决的:

#include <string.h>

extern void foo(char* m);
 
int main() {
    // warning: deprecated conversion from string constant to ‘char*’
    //foo("Hello");
   
    // no more warning
    char msg[] = "Hello";
    foo(msg);
}

我没有访问foo,以适应它接受const char*,这将是一个更好的解决方案,因为foo没有改变m。

其他回答

我也遇到过类似的问题,我是这样解决的:

#include <string.h>

extern void foo(char* m);
 
int main() {
    // warning: deprecated conversion from string constant to ‘char*’
    //foo("Hello");
   
    // no more warning
    char msg[] = "Hello";
    foo(msg);
}

我没有访问foo,以适应它接受const char*,这将是一个更好的解决方案,因为foo没有改变m。

我相信将-Wno-write-strings传递给GCC将抑制此警告。

只需使用g++的-w选项。

例子:

g++ -w -o simple.o simple.cpp -lpthread

记住,这并不能避免弃用。相反,它阻止在终端上显示警告信息。

现在,如果你真的想避免弃用,可以像这样使用const关键字:

const char* s = "constant string";  

使用-Wno-deprecated选项可以忽略已弃用的警告消息。

现在的问题是我用的是-Werror

在我看来,这才是你真正的问题。你可以尝试一些自动的方法从(char *)移动到(const char *),但我打赌他们不仅仅是工作。你将不得不让一个人参与至少一些工作。 就短期而言,只需忽略警告(但在我看来,它是开着的,否则它永远不会得到修复),只需删除-Werror。