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

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

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

char *s = "constant string";

或者像这样调用函数:

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

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


当前回答

看看这个情况:

typedef struct tagPyTypeObject
{
    PyObject_HEAD;
    char *name;
    PrintFun print;
    AddFun add;
    HashFun hash;
} PyTypeObject;

PyTypeObject PyDict_Type=
{
    PyObject_HEAD_INIT(&PyType_Type),
    "dict",
    dict_print,
    0,
    0
};

注意名称字段。使用gcc时,它编译时没有警告,但在g++中会。我不知道为什么。

其他回答

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

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

回复shindow的“答案”:

PyTypeObject PyDict_Type = { ... PyTypeObject PyDict_Type = { PyObject_HEAD_INIT (&PyType_Type), “东西”, dict_print, 0, 0 }; 注意名称字段。使用gcc时,它编译时没有警告,但在g++中会。我不知道为什么。

在gcc (Compiling C)中,-Wno-write-strings默认是激活的。

在g++(编译c++)中,-Wwrite-strings默认是活动的

这就是为什么会有不同的行为。

对于我们来说,使用Boost_python的宏会生成这样的警告。 所以我们在编译c++时使用-Wno-write-strings,因为我们总是使用-Werror。

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

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

putenv("DEBUG=1");

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

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

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

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

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

从这里到那里,就得到了这个解。这编译干净。

const char * timeServer[] = { "pool.ntp.org" }; // 0 - Worldwide 
#define WHICH_NTP            0 // Which NTP server name to use.
...
sendNTPpacket(const_cast<char*>(timeServer[WHICH_NTP])); // send an NTP packet to a server
...
void sendNTPpacket(char* address) { code }

我知道timeServer数组中只有一项。但可能还有更多。其余部分现在被注释掉以节省内存。