恼人的C ++ gcc警告信息

时间:2013-06-26 18:19:04

标签: c++

我编写了以下程序来匹配C ++中的正则表达式

#include <regex.h>
#include <iostream>

using namespace std;

/*
* Match string against the extended regular expression in
* pattern, treating errors as no match.
*
* return true for match, false for no match
*/


bool match(const char *string, char *pattern)
{
    int status; regex_t re;

    if (regcomp(&re, pattern, REG_EXTENDED|REG_NOSUB) != 0)
        return false;
    /* report error */

    status = regexec(&re, string, (size_t) 0, NULL, 0);
    regfree(&re);
    if (status != 0) {
        return false; /* report error */
    }
    return true;
}

int main()
{
    string str = "def fadi 100";
    bool matchExp = match(str.c_str(), "^[Dd][Ee][Ff][' '\t]+[A-z]+([,])?[''\t]+[0-9]+$");
    cout << (matchExp == true ? "Match": "No match") << endl;
}

该程序正常工作正常,但当我使用带有-Wall -Werror参数的gcc编译代码(Linux环境)时,我收到一条非常恼人的警告消息,说明如下:

main.cpp: In function ‘int main()’:
main.cpp:33:90: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]

有没有办法强迫编译器相信str.c_str()char * str相同?如果是这样,怎么样?

4 个答案:

答案 0 :(得分:7)

不,没有。该转换在C ++ 03中已弃用,在C ++ 11中是非法的;不要这样做。

转换的弃用来自字符串文字是只读的事实,因此const;使用指向非const char的指针访问它们可能会导致修改const个对象,从而调用未定义的行为。警告不是烦人的;它旨在帮助您避免可能导致应用程序崩溃 - 或者更糟。

另外,你在阅读警告信息时出错了;它不是c_str(),而是将字符串文字传递为char *

真正修复代码的唯一方法是将match的第二个参数更改为const char *,而不是char *,并将传递的字符串复制到新的缓冲区,内部到那个函数(为什么不在main()?因为使用内部缓冲区,你在调用者方面的样板更少)。


我还想提出完全不同的解决方案,因为问题标记为“C ++”:Boost.Regex

答案 1 :(得分:2)

  

有没有办法强迫编译器相信str.c_str()char * str相同?

这实际上不是问题 - 您已经将str.c_str()作为const char*传递。

问题是第二个参数是(也是)字符串文字,但是类型为char*。尝试将第二个参数更改为const char*

如果仍然会引发错误(由于regex.h函数未指定正确的常量),您将不得不在{{1}中执行此类操作}或main()

match()

请参阅here了解原因。

答案 2 :(得分:1)

问题是字符串文字应该只分配给一个const char的指针,所以你需要改变匹配来获取一个char const *模式(当你传递一个字符串文字时应该可以这样做)

答案 3 :(得分:1)

使函数匹配const char *的2参数,警告是因为它