带有构造函数的简单类引发警告:ISO C++ 禁止将字符串常量转换为 'char*' [重复]
Posted
技术标签:
【中文标题】带有构造函数的简单类引发警告:ISO C++ 禁止将字符串常量转换为 \'char*\' [重复]【英文标题】:Simple Class with Constructor throws an warning: ISO C++ forbids converting a string constant to 'char*' [duplicate]带有构造函数的简单类引发警告:ISO C++ 禁止将字符串常量转换为 'char*' [重复] 【发布时间】:2020-11-27 18:42:50 【问题描述】:所以我正在构建一个 Regex 类,带有一个简单的构造函数:
正则表达式.hpp
#ifndef REGEX_CUSTOM_CLASS
#define REGEX_CUSTOM_CLASS
#include <stdio.h>
using namespace std;
class Regex
private:
/* data */
public:
char *regex;
Regex(char str[]);
;
#endif // REGEX_CUSTOM_CLASS
正则表达式.cpp
#include <iostream>
#include <list>
#include <assert.h>
#include <ctype.h>
#include <stdio.h>
#include "regex.hpp"
using namespace std;
Regex::Regex(char str[])
regex = str;
工具.cpp
#include <iostream>
#include <stdio.h>
#include "lib/regex/regex.cpp"
using namespace std;
int main()
Regex my_regex("//");
cout << my_regex.regex << endl;
return 0;
但在我将其编译为 .exe 文件并运行后,我收到以下错误消息:
warning: ISO C++ forbids converting a string constant to 'char*' Regex my_regex("//");
我认为问题出在数据类型上。有什么问题?
【问题讨论】:
错误信息是正确的使用"//"
你需要有函数给const char*
参数。
@WebTools -- "\\"
不是 char *
。这是一个const char *
。
关于副本的注释:消息发生了一些变化,结果现在是硬错误,而不是用于让人们知道正在过渡到使其成为错误的警告,但是机制是一样的。
【参考方案1】:
您不能按值传递数组。当你写:
Regex::Regex(char str[])
这其实是
Regex::Regex(char* str)
此外,字符串文字的类型为const char [N]
(其中N
是字符串的长度,包括空终止符),当传递给函数时,它们会衰减为const char*
。从const char*
(指向常量char
,不要与指向char
的常量指针混淆)获取char*
会破坏常量的正确性。
要么使用std::string
作为参数类型,要么将其更改为const char*
。
【讨论】:
以上是关于带有构造函数的简单类引发警告:ISO C++ 禁止将字符串常量转换为 'char*' [重复]的主要内容,如果未能解决你的问题,请参考以下文章
PyArg_ParseTupleAndKeywords 抛出警告:ISO C++ 禁止将字符串常量转换为‘char*’ [-Wwrite-strings]