我从下面的函数中得到一个编译器“警告:从指针目标类型返回丢弃限定符”。
unsigned char* getBeginning(const unsigned char * Packet)
{
return Packet+3;
}
我已经在SO和其他地方研究了这个,看起来编译器抱怨说虽然我接受了一个const指针,但我返回一个非常量指针。
我想要完成的是:
1)我想让用户知道我不会在这个函数中改变他们的任何数据,因此是const。
2)但是,以后的函数会使用这里返回的指针进行更改,所以我也不想让我的返回类型为const。
在我没有收到警告的情况下,有更好的方法吗?我还在学习C.
答案 0 :(得分:10)
C没有从const限定的指针类型到非const限定的类型的隐式转换,所以你应该添加一个显式的,即一个强制转换。然后警告就会消失:
unsigned char* getBeginning(const unsigned char * Packet)
{
return (unsigned char *)Packet+3;
}
请注意,此功能稍微有点“危险”,因为它可以隐藏const限定的丢弃。但它并不比标准库中的strchr
之类的东西更危险。只要您不通过返回的指针尝试修改const限定对象,就可以很好地定义行为。
答案 1 :(得分:1)
Packet
被声明为const unsigned char *
。添加3时没有显式强制转换,您隐式声明结果为同一类型。
要修复错误,您必须显式转换返回类型:
return (unsigned char *) Packet + 3;