C++ 如何摆脱`从字符串常量到‘;字符*’;`GCC中的警告?

C++ 如何摆脱`从字符串常量到‘;字符*’;`GCC中的警告?,c++,string,gcc,C++,String,Gcc,因此,我正在开发一个非常大的代码库,最近升级到gcc 4.3,它现在触发了以下警告: 警告:已弃用从字符串常量到“char*”的转换 显然,解决这个问题的正确方法是找到每个声明 char *s = "constant string"; 或函数调用,如: void foo(char *s); foo("constant string"); 并使它们成为constchar指针。然而,这意味着至少要处理564个文件,这不是我现在希望执行的任务。现在的问题是,我运行的是-werror,所以我需要一些

因此,我正在开发一个非常大的代码库,最近升级到gcc 4.3,它现在触发了以下警告:

警告:已弃用从字符串常量到“char*”的转换

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

char *s = "constant string";
或函数调用,如:

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

并使它们成为
constchar
指针。然而,这意味着至少要处理564个文件,这不是我现在希望执行的任务。现在的问题是,我运行的是
-werror
,所以我需要一些方法来抑制这些警告。我该怎么做呢?

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

查看gcc的支持,以及(更改:)列表


对于gcc,您可以使用explained等指令。

如果它是活动的代码库,您可能仍然需要升级代码库。当然,手动执行更改是不可行的,但我相信这个问题可以通过一个
sed
命令一次性解决。不过,我还没有试过,所以请少说几句

find . -exec sed -E -i .backup -n \
    -e 's/char\s*\*\s*(\w+)\s*= "/char const* \1 = "/g' {} \;
这可能无法找到所有位置(甚至不考虑函数调用),但它可以缓解问题,并使手动执行剩余的少量更改成为可能

现在的问题是我在和-沃罗一起跑步

这是你真正的问题,依我看。你可以尝试一些从(char*)到(const char*)的自动化方法,但我会把钱花在它们上,而不仅仅是工作上。你必须有一个人参与至少部分工作。
短期而言,只需忽略警告(但我将其保持打开状态,否则它将永远无法修复),然后删除-Werror。

为什么不使用
-Wno deprecated
选项忽略不推荐的警告消息?

我遇到了一个类似的问题,我这样解决了它:

#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);
}
char str[] = "Test string";
const char* s="constant string";  
#包括
外部无效foo(char*m);
int main(){
//警告:已弃用从字符串常量到“char*”的转换
//福(“你好”);
//没有更多的警告
char msg[]=“你好”;
富(味精);
}

这是解决这个问题的适当方法吗?我没有访问
foo
的权限来调整它以接受
const char*
,尽管这是一个更好的解决方案(因为
foo
不会更改
m
)。

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

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

putenv("DEBUG=1");
但是,以下代码没有(它在将字符串传递给
putenv
之前在堆上复制该字符串):

在这种情况下(也许在大多数其他情况下),关闭警告是一个坏主意——这是有原因的。另一种选择(默认情况下使所有字符串都可写)可能效率低下


听编译器告诉你的

我无法使用编译器开关。所以我把这个翻过来:

char *setf = tigetstr("setf");
为此:

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

测试字符串
是常量字符串。所以你可以这样解决:

#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);
}
char str[] = "Test string";
const char* s="constant string";  
或:

看到这种情况:

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++中它会编译,我不知道为什么。

为什么不使用类型转换

(char*) "test"

下面是如何在文件中内联执行此操作,这样您就不必修改Makefile

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

#pragma GCC diagnostic pop
注意名称字段,在gcc中它会毫无警告地编译,但在g++中它会编译,我不知道为什么

gcc(编译C)
中,默认情况下,-Wno write strings处于活动状态

g++(编译C++)
中,默认情况下,Wwrite strings处于活动状态

这就是为什么会有不同的行为。 对于我们来说,使用
Boost_python
的宏会生成这样的警告。
因此,在编译C++时,我们使用<代码> -Wno编写字符串,因为我们总是使用<代码> - Werror < /C> > /P> < P>只使用-W选项来代替G++/P> 例如:

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

请记住,这并不能避免弃用,而是可以防止在终端上显示警告消息

现在,如果您真的想避免弃用,请使用以下const关键字:

#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);
}
char str[] = "Test string";
const char* s="constant string";  

任何传递字符串文本的函数
“我是字符串文本”
都应该使用
char const*
作为类型,而不是
char*

如果你要修东西,就把它修好

说明:

#include <iostream>

void print(char* ch);

void print(const char* ch) {
    std::cout<<ch;
}

int main() {
    print("Hello");
    return 0;
}
您不能使用字符串文字来初始化要修改的字符串,因为它们的类型为
const char*
。舍弃常量以便以后修改它们是,因此您必须通过
char
const char*
字符串
char
复制到动态分配的
char*
字符串中才能修改它们

示例:

#include <iostream>

void print(char* ch);

void print(const char* ch) {
    std::cout<<ch;
}

int main() {
    print("Hello");
    return 0;
}
#包括
作废打印(字符*ch);
无效打印(常量字符*ch){

std::cout执行从常量字符串到字符指针的类型转换,即

char *s = (char *) "constant string";
而不是:

void foo(char *s);
foo("constant string");
这项工作:

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

在C++中,使用<代码> COSTOSTCAST >如下

char* str = const_cast<char*>("Test string");
char*str=const_cast(“测试字符串”);
更换

char *str = "hello";

或者,如果您正在调用函数:

foo("hello");
替换为

foo((char*) "hello");

谢谢大家的帮助。这里选,那里选。这个解决方案编译干净。还没有测试代码。明天…也许

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 }
const char*timeServer[]={“pool.ntp.org”};//0-全球
#定义要使用的\u NTP 0//NTP服务器名称。
...
sendntpacket(const_cast(timeServer[WHICH_NTP]);//向服务器发送NTP数据包
...
void sendntpacket(字符*地址){code}

我知道,时间服务器数组中只有1个项目。但是还有更多的内容。其余的现在都被注释掉了。C++中,< /p> ,替换:

char *str = "hello";
与:

如果你想比较一下:

str.compare("HALLO");

我不知道如何申请