C++-不赞成从字符串常量转换为“char*”
C++ - deprecated conversion from string constant to ‘char*’
可能重复:
不推荐从字符串常量转换为字符*错误
我今天试着运行旧的C++代码(这段代码在2004年运行得很好:(。但现在我收到了这个错误消息:
make[1]: Entering directory `/home/thehost/Plocha/lpic-1.3.1/lpic/src'
source='error.C' object='error.o' libtool=no
depfile='.deps/error.Po' tmpdepfile='.deps/error.TPo'
depmode=gcc3 /bin/bash ../../config/depcomp
g++ -DHAVE_CONFIG_H -I. -I. -I../.. -g -O2 -Wno-deprecated -g -O2 -c -o error.o `test -f 'error.C' || echo './'`error.C
error.C: In constructor ‘error_handler::error_handler(const char*, char*)’:
error.C:49:7: error: ‘cerr’ was not declared in this scope
error.C:58:11: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite- strings]
error.C:58:11: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite- strings]
error.C:58:11: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite- strings]
error.C:58:11: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite- strings]
make[1]: *** [error.o] Error 1
make[1]: Leaving directory `/home/thehost/Plocha/lpic-1.3.1/lpic/src'
make: *** [all-recursive] Error 1
"error.C"文件的来源:
...
#include <error.h>
int error_handler::error_number = 0;
int error_handler::message_number = 0;
int error_handler::debug_number = 0;
int error_handler::Q_debug = 1;
int error_handler::object_number = 0;
int error_handler::tab = 33;
error_handler::error_handler(const char *name, char *error_file_name)
{
errname = new char [filename_size];
strcpy(errname,error_file_name);
errfile.open(errname,ios::app);
if (!errfile)
{
cerr << "error_handler: cannot open error file " << errname << endl;
exit(1);
}
errfile.close();
my_name = name;
object_number++;
debug("");
}
void error_handler::error(char* s1, char* s2, char *s3, char *s4)
{
error_number++ ;
errfile.open(errname,ios::app);
errfile.setf(ios::left);
errfile << "FAILURE: " << setw(tab) << my_name << " " << s1 << ' ' << s2
<< s3 << s4 << endl;
errfile.close();
exit(1);
}
...
"error.h"文件的来源:
...
using namespace std;
class error_handler {
static int error_number;
static int message_number;
static int Q_debug;
static int debug_number;
static int object_number;
const char *my_name;
char *errname;
ofstream errfile;
static int tab;
public:
error_handler(const char *, char *error_file_name);
void error(char* s1, char* s2="",
char* s3="", char* s4="");
void error(char* s1, double d2,
char* s3="", char* s4="");
void message(char* m1,
char* m2="", char* m3="", char* m4="");
void message(char* m1, double m2,
char* m3="", char* m4="");
void message(char* m1, double m2, char* m3, double m4);
void message(char* m1, double m2, char* m3, double m4,
char* m5, double m6, char* m7, double m8);
void message(char* m1, double m2, double m3, double m4, double m5 );
void message(char* m1, double m2, double m3, double m4 );
void message(char* m1, double m2, char* m3, double m4, char* m5, double m6);
void message(char *s1, double d2, double d3);
void message(char *s1, char *s2, double d3);
void debug(char* m1,
char* m2="", char* m3="", char* m4="");
void debug(char* m1, double m2,
char* m3="", char* m4="");
void debug(char* m1 , double m2, char* m3, double m4);
void debug(char* m1 , double m2, char* m3, double m4, char* m5, double m6);
};
#endif
你知道我该怎么修吗?如果是,请写清楚(我是新手…(。非常感谢。
我认为您的警告来自以下代码:
void message(char* m1,
char* m2="", char* m3="", char* m4="");
问题是C++中的字符串文字可以被视为char*
,但这样做是非常不安全的。写入由字符串文字定义的数组会导致Undefined Behavior(导致安全漏洞、程序崩溃等(,但常规的ol'char*
指针会允许您进行这种写操作。因此,强烈建议您将所有指向C样式字符串的char*
s改为const char*
s,以便编译器可以检查以确保您没有尝试对它们进行写入。在这种情况下,您的代码最好写成
void message(char* m1,
const char* m2="", const char* m3="", const char* m4="");
然而,由于您使用的是C++,因此更好的想法是使用std::string
:
void message(std::string m1,
std::string m2="", std::string m3="", std::string m4="");
这完全避免了这个问题,因为C++std::string
类型的参数中正确地包含了const char*
s,并对字符串进行了深度复制,所以如果您试图对字符串进行变异,可以保证不会破坏原始的字符数组。
希望这能有所帮助!
您有几个选项:
-
修复代码,使字符串文字(例如
"foo"
(永远不会隐式转换为char*
。它们应该是const char*
。 -
更改编译器命令行以包含
-Wno-write-strings
。这就是错误消息的-Wwrite-strings
部分所暗示的
我更喜欢第一种选择。
出现编译错误,表示未定义cerr。其他答案告诉你如何解决警告信息引发的问题。要进行编译,您需要包含iostream并使用命名空间std(或在流名称和endl之前添加命名空间(。
下面是一些示例代码:
#include <iostream>
using namespace std;
int main( )
{
cerr << "test" << endl;
}
尝试
#include <iostream>
在标题中。
- 将无符号char*转换为std::istream*C++
- 为什么这个函数将"const char*"转换为"void* const"而不是"const void*"
- 将函数参数"const char*"转换为"std::string_view"是
- C ++如何在使用"tolower"时将char转换为int
- 有没有办法在C++的赋值中将"char**"转换为"double"?
- JavaCPP 错误:无法将参数"1"的"char*"转换为"Abc*
- 为什么从 char 转换为 std::byte 可能是未定义的行为?
- 如何在虚幻引擎4中将char*转换为TCHAR?
- C++:将模板类型 char 转换为 std::string
- strcmp/char* 转换无法按预期工作
- C++中的SQLite char*转换
- 无法从 const char* 转换为 const char *&
- 在 C++ 中将 char 转换为 int,而无需符号位传播
- 如果必须包含西里尔字符,如何将 char* 转换为 std::string?
- 试图使用strCMP时的char转换错误
- 无法从'const char *'转换为'LPCTSTR'
- 将 std::vector<char> 转换为字符* 会导致字符缺陷
- 使用 static_cast 将 char 转换为 int c++
- 如何在 C++(MFC) 中将 char* 转换为 LPCTSTR
- 无法将const char转换为字符串构造字符串