丢弃' const'任职资格

时间:2015-09-21 07:52:01

标签: c pointers

我有以下代码 -

int acb(const uint16 *MsgPtr) 
{

uint16 *p = (MsgPtr + 1);
printf("%d", *p);

}

我收到以下警告 - 丢弃' const'为printf上面的行赋值的限定符。怎么解决?

3 个答案:

答案 0 :(得分:4)

acb的参数是指向常量uint16的指针,您创建的指针不指向常量。这会丢弃const限定符。 从传递给函数的参数中删除const或将p指向const uint16

为什么会这样? 您告诉编译器您保证不会更改MsgPtr指向的内容,但随后创建一个指针,可以修改MsgPtr指向的*(p - 1) = ...;

答案 1 :(得分:2)

  

如何解决?

  1. 阅读并理解错误消息。在这种情况下,错误消息指出pint16 *)的类型与MsgPtrconst int16 *)的类型之间存在差异。如果您不理解错误消息,询问错误消息,而不是询问如何解决错误消息。
  2. 由于您已阅读并理解有关丢失的const限定符的警告,因此您可以将const限定符添加到一个或删除const限定符从另一个。其中一个通常是最合理的解决方案,但它们不是唯一的解决方案:您还可以明确地转换const,或使用-Wno-discarded-qualifiers编译器标志来抑制警告;由于法院已经听过一百万次,如果你试图修改一个定义为const的对象,只是未定义的行为。

答案 2 :(得分:0)

您不能为const uint16*指针分配uint*值。编译器在这种情况下只发出警告。但是你必须保证你不会试图改变MsgPtr的内容。

因此,将p的类型更改为const uint16 *(使用const,编译器可帮助您保证不修改MsgPtr)或更改{{1}的类型1}}到MsgPtr参数。