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);