带有构造函数的简单类引发警告: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]

在 C++ 中禁止复制构造函数的最可靠方法是啥?

填充对象时覆盖 Propel 1.6 构造函数会引发警告

如何在其中构造一个带有成员函数的双端队列类? C++

错误:ISO C++ 禁止声明没有类型的“对象”

C ++:如何在派生类中定义基类构造函数,如果基构造函数具有带有私有成员的初始化列表[重复]