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

假如想象 提交于 2020-02-28 06:53:03

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

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

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

char *s = "constant string";

或函数调用如:

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

并使它们成为const char指针。 但是,这意味着触及564个文件,最小,这不是我希望在此时执行的任务。 现在的问题是我正在运行-werror ,所以我需要一些方法来扼杀这些警告。 我怎样才能做到这一点?


#1楼

PyTypeObject PyDict_Type=
{ ...

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

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

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

in g++ (Compiling C++) Wwrite-strings默认是活动的

这就是为什么会有不同的行为。 对于我们来说,使用Boost_pythonBoost_python产生这样的警告。 因此我们在编译C ++时使用-Wno-write-strings ,因为我们总是使用-Werror


#2楼

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

例:

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

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

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

const char* s="constant string";  

#3楼

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

char *setf = tigetstr("setf");

对此:

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

#4楼

传递字符串文字的任何函数"I am a string literal"应该使用char const *作为类型而不是char*

如果你要解决问题,请正确解决问题。

说明:

您不能使用字符串文字来初始化将被修改的字符串,因为它们的类型为const char* 。 抛弃const以便稍后修改它们是未定义的行为 ,因此你必须将const char* strings char by char复制到动态分配的char*字符串中以便修改它们。

例:

#include <iostream>

void print(char* ch);

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

int main() {
    print("Hello");
    return 0;
}

#5楼

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;
    }
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!