C++ 如何摆脱`从字符串常量到‘;字符*’;`GCC中的警告?
因此,我正在开发一个非常大的代码库,最近升级到gcc 4.3,它现在触发了以下警告: 警告:已弃用从字符串常量到“char*”的转换 显然,解决这个问题的正确方法是找到每个声明C++ 如何摆脱`从字符串常量到‘;字符*’;`GCC中的警告?,c++,string,gcc,C++,String,Gcc,因此,我正在开发一个非常大的代码库,最近升级到gcc 4.3,它现在触发了以下警告: 警告:已弃用从字符串常量到“char*”的转换 显然,解决这个问题的正确方法是找到每个声明 char *s = "constant string"; 或函数调用,如: void foo(char *s); foo("constant string"); 并使它们成为constchar指针。然而,这意味着至少要处理564个文件,这不是我现在希望执行的任务。现在的问题是,我运行的是-werror,所以我需要一些
char *s = "constant string";
或函数调用,如:
void foo(char *s);
foo("constant string");
并使它们成为
constchar
指针。然而,这意味着至少要处理564个文件,这不是我现在希望执行的任务。现在的问题是,我运行的是-werror
,所以我需要一些方法来抑制这些警告。我该怎么做呢?我相信将-Wno write string
传递给gcc将抑制此警告。查看gcc的支持,以及(更改:)列表
对于gcc,您可以使用explained等指令。如果它是活动的代码库,您可能仍然需要升级代码库。当然,手动执行更改是不可行的,但我相信这个问题可以通过一个
sed
命令一次性解决。不过,我还没有试过,所以请少说几句
find . -exec sed -E -i .backup -n \
-e 's/char\s*\*\s*(\w+)\s*= "/char const* \1 = "/g' {} \;
这可能无法找到所有位置(甚至不考虑函数调用),但它可以缓解问题,并使手动执行剩余的少量更改成为可能
现在的问题是我在和-沃罗一起跑步
这是你真正的问题,依我看。你可以尝试一些从(char*)到(const char*)的自动化方法,但我会把钱花在它们上,而不仅仅是工作上。你必须有一个人参与至少部分工作。
短期而言,只需忽略警告(但我将其保持打开状态,否则它将永远无法修复),然后删除-Werror。为什么不使用
-Wno deprecated
选项忽略不推荐的警告消息?我遇到了一个类似的问题,我这样解决了它:
#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);
}
char str[] = "Test string";
const char* s="constant string";
#包括
外部无效foo(char*m);
int main(){
//警告:已弃用从字符串常量到“char*”的转换
//福(“你好”);
//没有更多的警告
char msg[]=“你好”;
富(味精);
}
这是解决这个问题的适当方法吗?我没有访问
foo
的权限来调整它以接受const char*
,尽管这是一个更好的解决方案(因为foo
不会更改m
)。您还可以通过调用strdup()
从字符串常量创建一个可写字符串
例如,此代码生成一个警告:
putenv("DEBUG=1");
但是,以下代码没有(它在将字符串传递给putenv
之前在堆上复制该字符串):
在这种情况下(也许在大多数其他情况下),关闭警告是一个坏主意——这是有原因的。另一种选择(默认情况下使所有字符串都可写)可能效率低下
听编译器告诉你的 我无法使用编译器开关。所以我把这个翻过来:
char *setf = tigetstr("setf");
为此:
char *setf = tigetstr((char *)"setf");
测试字符串
是常量字符串。所以你可以这样解决:
#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);
}
char str[] = "Test string";
const char* s="constant string";
或:
看到这种情况:
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++中它会编译,我不知道为什么。为什么不使用类型转换
(char*) "test"
下面是如何在文件中内联执行此操作,这样您就不必修改Makefile
// gets rid of annoying "deprecated conversion from string constant blah blah" warning
#pragma GCC diagnostic ignored "-Wwrite-strings"
你以后可以
#pragma GCC diagnostic pop
注意名称字段,在gcc中它会毫无警告地编译,但在g++中它会编译,我不知道为什么
在gcc(编译C)
中,默认情况下,-Wno write strings处于活动状态
在g++(编译C++)
中,默认情况下,Wwrite strings处于活动状态
这就是为什么会有不同的行为。
对于我们来说,使用Boost_python
的宏会生成这样的警告。
因此,在编译C++时,我们使用<代码> -Wno编写字符串,因为我们总是使用<代码> - Werror < /C> > /P> < P>只使用-W选项来代替G++/P> 例如: g++-w-o simple.o simple.cpp-lpthread 请记住,这并不能避免弃用,而是可以防止在终端上显示警告消息 现在,如果您真的想避免弃用,请使用以下const关键字:
#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);
}
char str[] = "Test string";
const char* s="constant string";
任何传递字符串文本的函数
“我是字符串文本”
都应该使用char const*
作为类型,而不是char*
如果你要修东西,就把它修好
说明:
#include <iostream>
void print(char* ch);
void print(const char* ch) {
std::cout<<ch;
}
int main() {
print("Hello");
return 0;
}
您不能使用字符串文字来初始化要修改的字符串,因为它们的类型为const char*
。舍弃常量以便以后修改它们是,因此您必须通过char
将const char*
字符串char
复制到动态分配的char*
字符串中才能修改它们
示例:
#include <iostream>
void print(char* ch);
void print(const char* ch) {
std::cout<<ch;
}
int main() {
print("Hello");
return 0;
}
#包括
作废打印(字符*ch);
无效打印(常量字符*ch){
std::cout执行从常量字符串到字符指针的类型转换,即
char *s = (char *) "constant string";
而不是:
void foo(char *s);
foo("constant string");
这项工作:
void foo(const char s[]);
foo("constant string");
在C++中,使用<代码> COSTOSTCAST >如下
char* str = const_cast<char*>("Test string");
char*str=const_cast(“测试字符串”);
更换
char *str = "hello";
与
或者,如果您正在调用函数:
foo("hello");
替换为
foo((char*) "hello");
谢谢大家的帮助。这里选,那里选。这个解决方案编译干净。还没有测试代码。明天…也许
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 }
const char*timeServer[]={“pool.ntp.org”};//0-全球
#定义要使用的\u NTP 0//NTP服务器名称。
...
sendntpacket(const_cast(timeServer[WHICH_NTP]);//向服务器发送NTP数据包
...
void sendntpacket(字符*地址){code}
我知道,时间服务器数组中只有1个项目。但是还有更多的内容。其余的现在都被注释掉了。C++中,< /p> ,替换:
char *str = "hello";
与:
如果你想比较一下:
str.compare("HALLO");
我不知道如何申请