很抱歉,如果以前已经问过这个问题,但是我尝试了所有可用的解决方案,但仍然收到此错误。有人请解释此错误的含义以及避免此错误的解决方案。
char *find_char( char const *source,char const *chars ){
char const *result=NULL;
for(int i=0;*(chars+i);i++){
for(int j=0;*(source+j);j++){
if(*(chars+i)==*(source+j)){
result=chars+i;
return result;
}
}
}
return result;
}
编译时,发生以下错误:
6_1.c: In function ‘find_char’:
6_1.c:8:12: warning: return discards ‘const’ qualifier from pointer target type [-Wdiscarded-qualifiers]
return result;
^
6_1.c:12:9: warning: return discards ‘const’ qualifier from pointer target type [-Wdiscarded-qualifiers]
return result;
不能返回常量吗?
答案 0 :(得分:3)
您的标题有点误导,可能您也误解了警告:
警告:return会从指针目标类型中丢弃“ const”限定符 [-Wdiscarded-qualifiers]返回结果;
该函数声明为非常量,即char *find_char(...
,而result
声明为const
,即char const *result
;因此,语句return result
将意味着返回声明为const
的指针non-const
,从而返回警告。
我建议将您的函数定义为const char *find_char(...
。
答案 1 :(得分:1)
由于result
的类型为char const *
,请在函数签名中使用const来匹配它:
char const *find_char( char const *source,char const *chars )
答案 2 :(得分:1)
函数find_char
的返回类型与result
的类型不匹配。它们分别是char *
和char const *
。
将函数find_char
的返回类型更改为char const *
。
答案 3 :(得分:0)
这与C语言中的一个众所周知的缺点有关,我将在下面讨论。假设我们希望find_char
返回char *
,即使其输入为const char *
,也应在return
语句中使用显式强制转换:
return (char *) result;
对于return result;
,存在从char *
到不兼容类型const char *
的隐式转换。编译器警告,因为这可能是一个错误。通过显式强制转换,您可以向编译器显示转换是有意的,并且不太可能发出警告。 (如果这样做,则可以关闭该特定警告类别。)
关于C的缺点,请考虑find_char
的性质。它类似于C库例程strstr
,它也遇到相同的问题:
char *
,因此想要一个char *
。const char *
,以告知编译器该函数不会更改传递的字符串,因为这可能会带来一些优化机会。const char *
,但必须返回char *
,因此必须对其进行转换。换句话说,我们有一个char *
,我们想告诉编译器“该函数将接受char *
,它不会更改内容,但是会返回一个{{ 1}}结果。“要在C中执行此操作,必须将参数声明为char *
,但在返回结果指针之前将其转换为const char *
。