如何摆脱`弃用的转换从串定为'char*"警告在海湾合作委员会?
题
所以我的工作上一个非常大型代码,以及最近升级,海湾合作委员会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;
}
我有一个类似的问题,我解决了这样的:
#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