如何在GCC中摆脱从字符串常量到'char *'的过时转换警告?

c++ string gcc

406735 观看

24回复

8406 作者的声誉

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

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

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

char *s = "constant string";

或函数调用,例如:

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

并使其成为const char指针。但是,这意味着最少要触摸564个文件,这不是我现在希望执行的任务。现在的问题是我正在使用-werror,因此我需要某种方式来抑制这些警告。我怎样才能做到这一点?

作者: Josh Matthews 的来源 发布者: 2008 年 9 月 12 日

回应 24


220

14044 作者的声誉

决定

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

作者: DGentry 发布者: 2008 年 9 月 12 日

69

37601 作者的声誉

请查看gcc的Diagnostic Pragma支持以及-W警告选项列表(已更改:指向警告选项的新链接)。

对于gcc,您可以使用此处#pragma warning说明的指令。

作者: Rob Walker 发布者: 2008 年 9 月 12 日

30

416482 作者的声誉

如果它是活动的代码库,则您可能仍要升级代码库。当然,手动执行更改是不可行的,但我相信可以通过一个sed命令彻底解决此问题。不过,我还没有尝试过,所以下面加点盐。

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

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

作者: Konrad Rudolph 发布者: 2008 年 9 月 12 日

0

2699 作者的声誉

现在的问题是我正在运行-Werror

IMO,这是您的真正问题。您可以尝试一些从(char *)转换为(const char *)的自动化方法,但是我会花钱在它们上,而不仅仅是工作。您将需要一名人员参与至少一些工作。在短期内,只需忽略警告(但IMO保持警告状态,否则它将永远无法解决),然后删除-Werror。

作者: James Antill 发布者: 2008 年 9 月 15 日

0

0 作者的声誉

您为什么不使用该-Wno-deprecated选项忽略已弃用的警告消息?

作者: Klaus 发布者: 2008 年 10 月 26 日

69

1368 作者的声誉

我有一个类似的问题,我这样解决了:

#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)。

作者: BlackShift 发布者: 2009 年 2 月 12 日

0

35 作者的声誉

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

例如,此代码生成警告:

putenv("DEBUG=1");

但是,以下代码不会(将字符串传递给之前在堆上进行复制putenv):

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

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

听听编译器告诉您的内容!

作者: BillAtHRST 发布者: 2009 年 5 月 5 日

25

12865 作者的声誉

我不能使用编译器开关。所以我转过头了:

char *setf = tigetstr("setf");

对此:

char *setf = tigetstr((char *)"setf");
作者: vy32 发布者: 2009 年 8 月 21 日

7

71 作者的声誉

Test string是常量字符串。所以您可以这样解决:

char str[] = "Test string";

要么:

const char* str = "Test string";
printf(str);
作者: alexsid 发布者: 2010 年 3 月 17 日

0

9 作者的声誉

看到这种情况:

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 ++中,它将不知道为什么。

作者: shindow 发布者: 2010 年 8 月 24 日

4

49 作者的声誉

为什么不只使用类型转换?

(char*) "test"
作者: Dario 发布者: 2010 年 12 月 21 日

25

2282 作者的声誉

这是内联到文件中的方法,因此您无需修改​​Makefile。

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

然后您可以...

#pragma GCC diagnostic pop
作者: EdH 发布者: 2011 年 11 月 15 日

-2

100 作者的声誉

PyTypeObject PyDict_Type=
{ ...

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

监视名称字段,在gcc中会毫无警告地进行编译,但是在g ++中,它将不知道为什么。

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

g++ (Compiling C++)-Wwrite串是默认激活

这就是为什么会有不同的行为的原因。对于我们来说,使用的宏会Boost_python生成此类警告。所以我们-Wno-write-strings在编译C ++时使用,因为我们总是使用-Werror

作者: msn 发布者: 2012 年 5 月 14 日

0

1746 作者的声誉

只需为g ++使用-w选项

例:

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

请记住,这不会避免弃用,而是会阻止在终端上显示警告消息。

现在,如果您真的想避免过时,请使用const关键字,如下所示:

const char* s="constant string";  
作者: Md. Arafat Al Mahmud 发布者: 2012 年 6 月 8 日

551

6567 作者的声誉

传递字符串文字的任何函数"I am a string literal"都应使用char const *类型代替char*

如果您要修复某些问题,请正确修复。

说明:

您不能使用字符串文字来初始化将被修改的字符串,因为它们的类型是const char*。虚掷常量性以后修改它们是不确定的行为,所以你要复制你的const char*字符串char通过char到动态分配的char*字符串,以对其进行修改。

例:

#include <iostream>

void print(char* ch);

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

int main() {
    print("Hello");
    return 0;
}
作者: John 发布者: 2013 年 5 月 31 日

-1

1 作者的声誉

BlackShift的答案非常有帮助,我使用它的方式是:

extern string execute(char* cmd) {
            FILE* pipe = popen(cmd, "r");
            if (!pipe) return "ERROR";
            char buffer[256];
            std::string result = " ";
            while(!feof(pipe)) {
                    if(fgets(buffer, 128, pipe) != NULL)
                            result += buffer;
            }
            pclose(pipe);
            return result;
    }
    int main(){
            char cmd[]="grep -A1 'xml' out1.txt  | grep read|awk -F'=' 'BEGIN{sum=0}{sum=sum+$NF}END{print sum}'";
            string result=execute(cmd);
            int numOfBytes= atoi(result.c_str());   
            cout<<"Number of bytes = "<<numOfBytes<<endl;
            return 0;
    }
作者: coder 发布者: 2013 年 7 月 25 日

2

134 作者的声誉

从常量字符串到char指针进行类型转换,即

char *s = (char *) "constant string";
作者: tejp124 发布者: 2014 年 7 月 15 日

15

151 作者的声誉

代替:

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

这有效:

void foo(const char s[]);
foo("constant string");
作者: John 发布者: 2014 年 10 月 4 日

15

508 作者的声誉

在C ++中,使用const_cast如下所示

char* str = const_cast<char*>("Test string");
作者: appapurapu 发布者: 2015 年 5 月 15 日

24

249 作者的声誉

更换

char *str = "hello";

char *str = (char*)"hello";

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

foo("hello");

替换为

foo((char*) "hello");
作者: takataka 发布者: 2015 年 10 月 9 日

0

39 作者的声誉

谢谢大家的帮助。从这里挑选到那里就是这个解决方案。这样编译干净。尚未测试代码。也许明天吧...

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数组中只有1个项目。但是可能还有更多。其余的已被注释掉以节省内存。

作者: Micheal Morrow 发布者: 2016 年 3 月 5 日

1

396 作者的声誉

在C ++中,替换:

char *str = "hello";

有:

std::string str ("hello");

如果您想比较一下:

str.compare("HALLO");
作者: Sohrab 发布者: 2017 年 12 月 21 日

1

11 作者的声誉

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

使用Arduino Sketch,我有一个引起警告的函数。

原始函数:char StrContains(char * str,char * sfind)

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

修改:char StrContains(const char * str,const char * sfind)。

所有警告都消失了。

作者: MyGEARStationcom 发布者: 2018 年 3 月 8 日

-1

1 作者的声誉

const将字符串声明为a 将解决问题:

char const*s = "constant string";
作者: Jaa Hsn 发布者: 2019 年 8 月 27 日
32x32