g ++ strstr表示从const char*到char*的无效转换

Spa*_*ott 3 c++ string

我正在转换用C++编写的用于Windows的项目.一切都很顺利(这意味着我清楚地看到需要改变哪些东西才能使C++成为正确的东西),直到我点击这个,这是我在关键字=值对的字符串中找到关键字的常规方法:

bool GetParameter(const char * haystack, const char *needle) {
    char *search, *start;
    int len;
    len = strlen(needle) + 4;     //  make my own copy so I can upper case it...
    search = (char *) calloc(1,len);
    if (search == NULL) return false;
    strcpy(search,needle);
    strupr(search);
    strcat(search,"=");           //  now it is 'KEYWORD='
    start = strstr(haystack,search);  <---- ERROR from compiler
Run Code Online (Sandbox Code Playgroud)

g ++告诉我"从const char*到char*的转换无效"(投诉的确切位置是参数变量'search')

但似乎g ++是阅读障碍的.因为我实际上正在走另一条路.我将char*传递给const char*

(所以转换是"从char*到const char*")

strstr原型是char*strstr(const char*,const char*)

这里没有危险.任何const char*都没有被修改.
为什么告诉我这个?我该怎么办才能修复它?

谢谢你的帮助.

Jon*_*ely 7

问题的背景是C将函数定义strstr为:

char* strstr(const char*, const char*);
Run Code Online (Sandbox Code Playgroud)

这是因为C不允许重载函数,所以为了允许你使用strstrconst和非const字符串,它接受const字符串并返回非const.这引入了C已经脆弱的类型系统的弱点,因为它消除了字符串中的常量.strstr如果您使用不可修改的字符串,则不会尝试通过返回的指针来编写C程序员的工作.

在C++中,函数被一对重载函数取代,标准说:

7.功能签名strstr(const char*, const char*)应由两个声明代替:
const char* strstr(const char* s1, const char* s2);
char* strstr( char* s1, const char* s2);
两者都应与原始声明具有相同的行为.

这是类型安全的,如果你传入一个const字符串,你会得到一个const字符串.你的代码传入一个const字符串,所以G ++遵循标准,返回一个const字符串.你得到了你所要求的.

您的代码在Windows上编译,因为您在Windows上使用的标准库显然没有提供重载,只提供C版本.这允许您传入const字符串并返回非const字符串.G ++提供了标准所要求的C++版本.该错误告诉您,您正在尝试将const返回值转换为非const char*.解决方案是将返回值分配给一个const char*,它是可移植的并且可以在任何地方编译.