return从指针目标类型中丢弃“ const”限定词

时间:2019-02-11 07:55:02

标签: c

很抱歉,如果以前已经问过这个问题,但是我尝试了所有可用的解决方案,但仍然收到此错误。有人请解释此错误的含义以及避免此错误的解决方案。

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;

不能返回常量吗?

4 个答案:

答案 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 *