C 是否从指针目标类型中丢弃限定符?

C 是否从指针目标类型中丢弃限定符?,c,gcc,C,Gcc,-Wcast qual在stristr()的返回行上输出此警告。有什么问题 警告:强制转换将丢弃指针目标类型的限定符 char*stristr(const char*string,const char*substring) { 尺寸\u t字符串长度=字符串(字符串); char*stringlowered=malloc(stringlength+1); strcpy(弦,弦); tolower2(StringLower2);//在我的源代码中,它有一个不同的名称,对不起。 char*subst

-Wcast qual
在stristr()的
返回
行上输出此警告。有什么问题

警告:强制转换将丢弃指针目标类型的限定符

char*stristr(const char*string,const char*substring)
{
尺寸\u t字符串长度=字符串(字符串);
char*stringlowered=malloc(stringlength+1);
strcpy(弦,弦);
tolower2(StringLower2);//在我的源代码中,它有一个不同的名称,对不起。
char*substringlowered=malloc(strlen(substring)+1);
strcpy(子字符串降低,子字符串);
tolower2(substringlowerd);//在我的源代码中,它有一个不同的名称,对不起。
const char*returnvalue=strstrstr(stringlowered,substringlowered);
if(返回值!=NULL)
{
大小返回值长度=strlen(返回值);
returnvalue=字符串;
returnvalue+=stringlength—returnvaluelength;
}
免费(降低);
自由(降低子串);
返回(char*)返回值;
}
编辑:
在Glibc2.15的strstr()源代码中:

return(char*)haystack\u start;//从常量字符转换为(字符*)*

您正在将
常量字符*
(我们称之为不可修改字符串)转换为
常量字符*
(可修改字符串)您将丢弃
常量
限定符。

您已声明
返回值
作为指向
常量字符
的指针,但随后您将其转换为指向非
常量字符
的指针。您丢弃了
const
限定符,因此编译器抱怨您丢弃了它


解决方案是更改函数的返回类型,或者找到指向的非
常量char
。您的函数中没有一个,所以如果您真的需要一个非代码> const 返回类型,可以考虑更改参数类型。

尝试更改声明/赋值

const char *returnvalue = strstr(stringlowered, substringlowered);


然后删除返回行中的强制转换(您不再需要它)。

您可能应该将返回值更改为
const char*
,然后删除强制转换。原型与标准C的strstrstr()完全相同。@Nigel:standard C的
str()
将执行与您相同的弃置
const
操作-只是在构建过程中没有编译库,因此那里的警告早已消失(实际上,我确信它甚至没有为库的构建启用)。如果您希望在构建
stristr()
函数时禁用此特定警告,使其具有与标准库相同的属性,即将非常量指针返回到具有常量指针的字符串中(因此用户有责任避免使用指针做错事).原型与标准C的strstr()源代码完全相同,后者抛出大量的
丢弃限定符
警告。我想唯一的解决办法是让
string
而不是
const
@NigelRidley:嗯,没有一个标准的C实现,但我想大多数C库的核心都是在语言标准化之前就实现的。因此,如果您深入研究,就会发现有问题的代码!还值得注意的是,这些库通常是由编译器作者编写的,因此他们可以自由编写各种各样的乱码,否则这些乱码可能会有问题/实现定义/未定义。您可能需要检查您的平台是否还没有可用的
strcasestr()
char *returnvalue = strstr(stringlowered, substringlowered);