如何在GCC中摆脱从字符串常量到'char *'的过时转换警告?
406735 观看
24回复
因此,我正在开发一个非常大的代码库,最近将其升级到gcc 4.3,现在会触发以下警告:
警告:不建议将字符串常量转换为'char *'
显然,解决此问题的正确方法是找到每个声明,例如
char *s = "constant string";
或函数调用,例如:
void foo(char *s);
foo("constant string");
并使其成为const char
指针。但是,这意味着最少要触摸564个文件,这不是我现在希望执行的任务。现在的问题是我正在使用-werror
,因此我需要某种方式来抑制这些警告。我怎样才能做到这一点?
回应 (24)
220像
551像
传递字符串文字的任何函数"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
发布者: 31.05.2013 11:07
69像
我有一个类似的问题,我这样解决了:
#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
)。
69像
请查看gcc的Diagnostic Pragma支持以及-W警告选项列表(已更改:指向警告选项的新链接)。
对于gcc,您可以使用此处#pragma warning
说明的指令。
30像
如果它是活动的代码库,则您可能仍要升级代码库。当然,手动执行更改是不可行的,但我相信可以通过一个sed
命令彻底解决此问题。不过,我还没有尝试过,所以下面加点盐。
find . -exec sed -E -i .backup -n \
-e 's/char\s*\*\s*(\w+)\s*= "/char const* \1 = "/g' {} \;
这可能无法找到所有位置(甚至不考虑函数调用),但可以缓解问题,并可以手动执行一些剩余更改。
作者: Konrad Rudolph 发布者: 12.09.2008 06:4925像
我不能使用编译器开关。所以我转过头了:
char *setf = tigetstr("setf");
对此:
char *setf = tigetstr((char *)"setf");
作者: vy32
发布者: 21.08.2009 02:14
25像
这是内联到文件中的方法,因此您无需修改Makefile。
// gets rid of annoying "deprecated conversion from string constant blah blah" warning
#pragma GCC diagnostic ignored "-Wwrite-strings"
然后您可以...
#pragma GCC diagnostic pop
作者: EdH
发布者: 15.11.2011 05:47
24像
更换
char *str = "hello";
同
char *str = (char*)"hello";
或者,如果您正在调用函数:
foo("hello");
替换为
foo((char*) "hello");
作者: takataka
发布者: 09.10.2015 07:52
15像
代替:
void foo(char *s);
foo("constant string");
这有效:
void foo(const char s[]);
foo("constant string");
作者: John
发布者: 04.10.2014 03:06
15像
在C ++中,使用const_cast
如下所示
char* str = const_cast<char*>("Test string");
作者: appapurapu
发布者: 15.05.2015 08:37
7像
Test string
是常量字符串。所以您可以这样解决:
char str[] = "Test string";
要么:
const char* str = "Test string";
printf(str);
作者: alexsid
发布者: 17.03.2010 10:18
4像
2像
1像
在C ++中,替换:
char *str = "hello";
有:
std::string str ("hello");
如果您想比较一下:
str.compare("HALLO");
作者: Sohrab
发布者: 21.12.2017 12:56
1像
我不明白如何应用您的解决方案:( – kalmanIsAGameChanger
使用Arduino Sketch,我有一个引起警告的函数。
原始函数:char StrContains(char * str,char * sfind)
为了停止警告,我在char * str和char * sfind前面添加了const。
修改:char StrContains(const char * str,const char * sfind)。
所有警告都消失了。
作者: MyGEARStationcom 发布者: 08.03.2018 08:030像
看到这种情况:
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 发布者: 24.08.2010 02:140像
您还可以通过调用,从字符串常量创建可写字符串strdup()
。
例如,此代码生成警告:
putenv("DEBUG=1");
但是,以下代码不会(将字符串传递给之前在堆上进行复制putenv
):
putenv(strdup("DEBUG=1"));
在这种情况下(也许在其他大多数情况下),关闭警告是一个坏主意,它的存在是有原因的。另一种选择(默认情况下使所有字符串都可写)可能效率不高。
听听编译器告诉您的内容!
作者: BillAtHRST 发布者: 05.05.2009 08:490像
只需为g ++使用-w选项
例:
g ++ -w -o simple.o simple.cpp -lpthread
请记住,这不会避免弃用,而是会阻止在终端上显示警告消息。
现在,如果您真的想避免过时,请使用const关键字,如下所示:
const char* s="constant string";
作者: Md. Arafat Al Mahmud
发布者: 08.06.2012 04:43
0像
0像
现在的问题是我正在运行-Werror
IMO,这是您的真正问题。您可以尝试一些从(char *)转换为(const char *)的自动化方法,但是我会花钱在它们上,而不仅仅是工作。您将需要一名人员参与至少一些工作。在短期内,只需忽略警告(但IMO保持警告状态,否则它将永远无法解决),然后删除-Werror。
作者: James Antill 发布者: 15.09.2008 10:330像
谢谢大家的帮助。从这里挑选到那里就是这个解决方案。这样编译干净。尚未测试代码。也许明天吧...
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 发布者: 05.03.2016 11:47-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
发布者: 25.07.2013 09:59
-1像
-2像
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
来自类别的问题 :
- c++ 理解指针有什么障碍,克服它们可以做些什么?
- c++ 在C ++中解析INI文件的最简单方法是什么?
- c++ 什么时候应该在C ++中使用“朋友”?
- c++ 你如何清除stringstream变量?
- c++ 在C ++中,构造函数和析构函数可以是内联函数吗?
- c++ 在C ++中,什么是虚拟基类?
- string C#中字符串和字符串有什么区别?
- string 为什么Ruby没有真正的StringBuffer或StringIO?
- string 在C#中将字符串转换为枚举
- string 将List <Integer>转换为List <String>
- string 连接字符串最有效的方法?
- string 使用jQuery转义HTML字符串
- gcc 为什么库链接的顺序有时会导致GCC错误?
- gcc 如何在GCC中摆脱从字符串常量到'char *'的过时转换警告?
- gcc 我的程序崩溃时如何自动生成堆栈跟踪
- gcc 如何模拟内存分配错误
- gcc 你如何在gcc中从C / C ++源获得汇编程序输出?
- gcc 使用CMake预编译的头文件