我有以下代码 -
int acb(const uint16 *MsgPtr)
{
uint16 *p = (MsgPtr + 1);
printf("%d", *p);
}
我收到以下警告 - 丢弃' const'为printf上面的行赋值的限定符。怎么解决?
答案 0 :(得分:4)
acb
的参数是指向常量uint16
的指针,您创建的指针不指向常量。这会丢弃const
限定符。
从传递给函数的参数中删除const
或将p
指向const uint16
。
为什么会这样?
您告诉编译器您保证不会更改MsgPtr
指向的内容,但随后创建一个指针,可以修改MsgPtr
指向的*(p - 1) = ...;
答案 1 :(得分:2)
如何解决?
p
(int16 *
)的类型与MsgPtr
(const int16 *
)的类型之间存在差异。如果您不理解错误消息,询问错误消息,而不是询问如何解决错误消息。const
限定符的警告,因此您可以将const
限定符添加到一个或删除const
限定符从另一个。其中一个通常是最合理的解决方案,但它们不是唯一的解决方案:您还可以明确地转换const
,或使用-Wno-discarded-qualifiers
编译器标志来抑制警告;由于法院已经听过一百万次,如果你试图修改一个定义为const
的对象,只是未定义的行为。 答案 2 :(得分:0)
您不能为const uint16*
指针分配uint*
值。编译器在这种情况下只发出警告。但是你必须保证你不会试图改变MsgPtr
的内容。
因此,将p
的类型更改为const uint16 *
(使用const
,编译器可帮助您保证不修改MsgPtr
)或更改{{1}的类型1}}到MsgPtr
参数。