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

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

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

char *s = "constant string";

或者像这样调用函数:

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

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


当前回答

如果它是一个活动的代码库,您可能仍然希望升级代码库。当然,手动执行更改是不可行的,但我相信这个问题可以通过一个sed命令一劳永逸地解决。不过,我还没有尝试过,所以对下面的建议半信半疑。

find . -exec sed -E -i .backup -n \
    -e 's/char\s*\*\s*(\w+)\s*= "/char const* \1 = "/g' {} \;

这可能无法找到所有的位置(甚至不考虑函数调用),但它可以缓解问题,并使手动执行剩余的更改成为可能。

其他回答

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

例子:

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

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

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

const char* s = "constant string";  

如果它是一个活动的代码库,您可能仍然希望升级代码库。当然,手动执行更改是不可行的,但我相信这个问题可以通过一个sed命令一劳永逸地解决。不过,我还没有尝试过,所以对下面的建议半信半疑。

find . -exec sed -E -i .backup -n \
    -e 's/char\s*\*\s*(\w+)\s*= "/char const* \1 = "/g' {} \;

这可能无法找到所有的位置(甚至不考虑函数调用),但它可以缓解问题,并使手动执行剩余的更改成为可能。

在c++中,替换:

char *str = "hello";

:

std::string str ("hello");

如果你想比较一下:

str.compare("HALLO");

而不是:

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

如此:

void foo(const char s[]);
foo("constant string");

查看GCC的Diagnostic Pragma支持,以及-W警告选项列表。

对于GCC,你可以像这里解释的那样使用#pragma警告指令。