警告:丢弃' const'指针目标类型

时间:2016-05-11 11:11:07

标签: c

不是const char *s意味着" s是一个指向常量字符的指针"那为什么它会给我这个警告呢?我不是想改变价值观。

第一个功能警告是return discards 'const' qualifiers from pointer target type

,第二个警告是assignment discards 'const' qualifiers from pointer target type

我试图制作string.h中定义的库函数,并告诉我如何纠正它。

char *my_strchr( const char *s, int c )
{
    for(;*s!='\0';s++)
       if(*s==c)
          return s; // warning

    return 0;
}



char *my_strpbrk( const char *s1, const char *s2 )
{
    char *s2ptr;

    for(;*s1!='\0';s1++)
        for(s2ptr=s2;*s2ptr!='\0';s2ptr++) //warning
           if(*s1==*s2ptr)
               return s2ptr;

    return 0;
}

3 个答案:

答案 0 :(得分:12)

  

没有const char * s意味着" s是一个指向常量字符的指针"

确实如此。您收到警告,因为您正在尝试将其转换为指向(非常量)char的指针。在C中有一条规则说,从指针到类型转换为指针到const类型,,但不是相反的方式,总是可以的。

如果您的代码尝试更改值,则无关紧要。只需使用char*,就告诉编译器你想要一个允许改变值的指针。

对于" const correctness",大多数C标准库函数并不总是有意义的。例如,没有办法干净地实施strchr。您将不得不返回(char*)s并抛弃const,这是非常糟糕的编程习惯。这是指定strchr函数的人的错误:它在设计上存在缺陷。

答案 1 :(得分:3)

For first warning: return discards 'const' qualifiers from pointer target type

C does not have an implicit conversion from const-qualified pointer types to non-const-qualified ones, so to overcome the warning you need to add it explicitly.

Replace return s; with return (char *)s;

For second warning: assignment discards 'const' qualifiers from pointer target type

  • 's2ptr' is of type char * and 's2' is of type const char *
  • You are not allowed to assign a const char* value to a char * pointer.

And regarding how to fix this warning... It depends on what you are trying to do. Either you can make char *s2ptr as const char * s2ptr or remove the const from s2.

So if you wish to convert char *s2ptr to const char *s2ptr, do remember to explicitly cast s2ptr to (char *)s2ptr while returning it in the my_strpbrk() function.

答案 2 :(得分:-1)

对于第一种情况,您的返回类型为char您尝试传递const char作为返回。

对于第二种情况,问题出在s2ptr=s2s2ptrchars2const char