不是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;
}
答案 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
char *
and 's2' is of type const char *
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=s2
。 s2ptr
是char
,s2
是const char
。