C:编译器警告“返回丢弃指针目标类型的限定符”

时间:2014-07-18 17:04:09

标签: c pointers const

我从下面的函数中得到一个编译器“警告:从指针目标类型返回丢弃限定符”。

unsigned char* getBeginning(const unsigned char * Packet)
{
                    return Packet+3;
}

我已经在SO和其他地方研究了这个,看起来编译器抱怨说虽然我接受了一个const指针,但我返回一个非常量指针。

我想要完成的是:

1)我想让用户知道我不会在这个函数中改变他们的任何数据,因此是const。

2)但是,以后的函数会使用这里返回的指针进行更改,所以我也不想让我的返回类型为const。

在我没有收到警告的情况下,有更好的方法吗?我还在学习C.

2 个答案:

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