繁体   English   中英

C 指向 const 的指针 - 如何消除警告

[英]C pointer to a const - how to quieten warnings

我有一个这样的数组:

const uint8_t Translations[] =
{
    0xA6,0xA0,1,0,
    0xA1,0x87,2,0,
    0xA0,0xBE,3,0,
    0,
};

我想用指针访问它:

uint8_t * p_translations = Translations;    

我收到警告:

警告:从 'const uint8_t *const' 分配给 'uint8_t *' 会丢弃限定符。

我对此很好,因为我只读取并且从不写入 *p_translations。

有没有办法在不抑制警告的情况下使编译器(Microchip XC8)安静下来?

正如警告所述,通常没有充分的理由丢弃const限定符。 一些可能的原因是在传递给期望原始不合格指针的 API 时。 如果 API 不需要更改指针指向的数据,它应该在声明中包含一个const

此外,编译器警告通常可以帮助开发人员,并且主要是应该注意的警告。

对于您的情况,如果您从不打算修改p_translations指向的内容,那么p_translations没有理由不应该是uint8_t const* 另一方面,如果您必须修改Translations ,那么您应该从Translations中完全删除const 使用const表示在整个程序生命周期内保持不变的实体。 拥有一个可以修改的非const数组是非常好的,否则采用const 是许多链接之一,可以了解为什么const除了指示数据的const性之外还有帮助,即编译器优化的可能机会和避免编写意外修改数据的代码。

您也应该将指针设为const ,带有指针的const意味着它们指向的 memory 区域是只读的。 这告诉编译器它可以做或不做一些事情。 在您的情况下(不使用 const 和指针)编译器理解作为访问只读 memory 部分的常规指针,并引发警告,警告的原因是您实际上可以使用指针更改const变量,但您应该避免不惜一切代价,因为它是 UB 并且您的程序可能会做不应该做的事情。 但是,当您将指针声明为const时,它会告诉编译器将其视为const并且不允许对该 memory 区域进行任何写入。 请记住,您在创建指针时使用的声明只会告诉编译器您指向的数据类型。 所以这并不意味着你的指针是不可改变的。 如果你想让你的指针const你像这样声明它type* const ptr 我希望我提供了足够的帮助。

您有一个警告,因为您将const数组的地址存储到非const限定的指针中。

使用const uint8_t *p_translations = Translations; 解决问题。

注意const uint8_t *p_translations等价于uint8_t const *p_translations ,但与 uint8_t * const p_translations 不同, uint8_t * const p_translations是一个不能改变的指针,指向可以通过指针改变的数据。

p_translations定义为const uint8_t *p_translations是一种告诉编译器您不打算使用此指针修改p_translations指向的数据的方法。 由于Translations本身被定义为const数据,因此只能通过const限定指针对其进行操作,以检测尝试修改它的代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM