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

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

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

char *s = "constant string";

或者像这样调用函数:

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

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


当前回答

还可以通过调用strdup()从字符串常量创建可写字符串。

例如,这段代码生成一个警告:

putenv("DEBUG=1");

然而,下面的代码不会这样做(它在将字符串传递给putenv之前在堆上复制了一个字符串):

putenv(strdup("DEBUG=1"));

在这种情况下(也许在大多数情况下)关闭警告是一个坏主意——它的存在是有原因的。另一种替代方法(默认情况下使所有字符串都可写)可能效率很低。

听听编译器在告诉你什么!

其他回答

下面是如何在文件中内联完成它,因此您不必修改Makefile。

// gets rid of annoying "deprecated conversion from string constant blah blah" warning
#pragma GCC diagnostic ignored "-Wwrite-strings"

之后你可以…

#pragma GCC diagnostic pop

还可以通过调用strdup()从字符串常量创建可写字符串。

例如,这段代码生成一个警告:

putenv("DEBUG=1");

然而,下面的代码不会这样做(它在将字符串传递给putenv之前在堆上复制了一个字符串):

putenv(strdup("DEBUG=1"));

在这种情况下(也许在大多数情况下)关闭警告是一个坏主意——它的存在是有原因的。另一种替代方法(默认情况下使所有字符串都可写)可能效率很低。

听听编译器在告诉你什么!

我不明白如何应用你的解决方案:(- kalmanIsAGameChanger

在使用Arduino草图时,我有一个函数引起了我的警告。

最初的功能:

char StrContains(char *str, char *sfind)

为了停止警告,我在char *str和char * find前面添加了const。

修改:

char StrContains(const char *str, const char *sfind).

所有的警告都消失了。

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

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

我不能使用编译器开关。所以我把这个:

char *setf = tigetstr("setf");

:

char *setf = tigetstr((char *)"setf");