所以我的工作上一个非常大型代码,以及最近升级,海湾合作委员会4.3,现在触发这种警告:

警告:弃用的转换从串定为'char*'

显然,正确的办法来解决这个问题是找到每一个宣言就像

char *s = "constant string";

或功能的电话,如:

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

并且让他们 const char 指针。然而,这将意味着接触564文件、最低,这不是一个任务,我希望执行在这个时间点。现在的问题是,我有 -werror, 所以我需要一些方法来压制这些警告。我怎么可以那样做?

有帮助吗?

解决方案

我相信,传递 -Wno-write-strings 以海湾合作委员会将抑制这种警告。

其他提示

任何功能进入其中,你通过字符串 "I am a string literal" 应该使用 char const * 作为的类型,而不是的 char*.

如果你要的东西修复,修复它的权利。

说明:

你不能使用的字符串来初始化串的,将被修改,因为它们的类型 const char*.破constness到以后的修改他们是 未定义的行为, 所以你要复制你 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;
}

检查了海湾合作委员会的 诊断Pragma 支持,并列表中的 -W警告选择 (改变: 新链接到警告的选择).

对于海湾合作委员会,可以使用 #pragma warning 指令就像的解释 在这里,.

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

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

如果它是一个活动代码的基础,你可能仍然想要升级代码的基础。当然,进行改动手动是不可行的,但我认为,这个问题可以解决一次并对所有通过一个单一的 sed 命令。我没有尝试过,虽然,所以采取以下一粒盐。

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

这可能找不到所有的地方(即使不考虑功能的电话),但是它将会缓解这个问题,并使它能够执行的几个剩余的变化。

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

char *setf = tigetstr("setf");

这样的:

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

这里是如何做到这一点的内联在一个文件,所以你不必修改Makefile。

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

然后你可以以后...

#pragma GCC diagnostic pop

替换

char *str = "hello";

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

或如果你是呼吁在功能:

foo("hello");

替换

foo((char*) "hello");

代替:

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

这个工作:

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

C++,使用 const_cast 如下面

char* str = const_cast<char*>("Test string");

Test string 是const串。这样你就可以解决这样的:

char str[] = "Test string";

或者:

const char* str = "Test string";
printf(str);

为什么不只是利用类型的铸造的?

(char*) "test"

做的类型转换从不断串char指针,即,

char *s = (char *) "constant string";

在C++、更换:

char *str = "hello";

有:

std::string str ("hello");

如果你想要的比较:

str.compare("HALLO");

我不了解如何应用你的解决方案:(–kalmanIsAGameChanger

工作与Arduino的草图,我有一个功能引起我的警告。

原有功能:char StrContains(char*str,char*sfind)

停止的警告我加入 const 在前char*str和char*sfind.

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

所有的警告,走了。

看到这样的情况:

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
};

看名称的领域,在海湾合作委员会编制没有警告,但是在克++会,我不知道为什么。

你还可以创建一个可写字符串串不断通过调用 strdup().

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

putenv("DEBUG=1");

然而,以下代码不会(它使一个复制的串上堆之前通过它 putenv):

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

在这种情况下(以及或许在大多数其他)关闭警告是一个不好的想法--这是有原因的。其它可供选择的(使所有的字符串写的默认)是潜在的效率低下。

听到什么编译器是告诉你!

只是使用w选择g++

例如:

g++-w-o简单。o simple.cpp -lpthread

记住这并不能避免过时而可以防止显示警告信息的终端。

现在如果你真的想要避免贬低使用const关键词是这样的:

const char* s="constant string";  

为什么你不用 -Wno-deprecated 选择忽略弃用预警信息?

现在的问题是,我有-Werror

这是你真正的问题,海事组织。你可以尝试一些自动的方式正从(char*)至(const char*)但是我会把他们的钱不只是工作。你将必须有一个人参与的至少一些工作。对于短期内,只是忽略了警告(但海事组织把它留在,或者它将永远不会得到固定),只是删除-Werror.

谢谢你,所有的,为帮助。挑选从这里和那里来这个解决方案。这个汇编的清洁。没有测试的代码。明天...也许...

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 }

我知道,只有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;
    }
PyTypeObject PyDict_Type=
{ ...

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

看名称的领域,在海湾合作委员会编制没有警告,但是在克++会,我不知道为什么。

gcc (Compiling C),的输出端包含一条写字是积极的默认。

g++ (Compiling C++) -Wwrite串活动是通过默认

这就是为什么有一个不同的行为。对我们使用的宏 Boost_python 产生这样的警告。因此,我们使用 -Wno-write-strings 当汇编C++由于我们始终使用 -Werror

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top