首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >警告:初始化将丢弃指针目标类型[-Wdiscarded- qualifier ]中的“const”限定符

警告:初始化将丢弃指针目标类型[-Wdiscarded- qualifier ]中的“const”限定符
EN

Stack Overflow用户
提问于 2019-06-12 03:10:54
回答 1查看 1.1K关注 0票数 -1

我试图理解为什么我的编译器警告我这段代码:

代码语言:javascript
复制
static const char *const  _menuMain_Strings_1[] __ATTR_PROGMEM__ = { _menuMain_L1,
        _menuMain_L2, _menuMain_L3, _menuMain_L4 }

static const MENU_DEFINITION _menuDef_Main_1 __ATTR_PROGMEM__ = {
        _menuMain_Strings_1, _menuMain_Fields_1 };
代码语言:javascript
复制
../menudefs.h:53:3: warning: initialization discards 'const' qualifier from pointer target type [-Wdiscarded-qualifiers]
   53 |   _menuMain_Strings_1, _menuMain_Fields_1 };
      |   ^~~~~~~~~~~~~~~~~~~

首先,我必须添加额外的*const,以便它生成一个十六进制文件来消除编译器错误。根据我的假设,无论如何,编译器都会丢弃一个const。我怎样才能在不给我警告的情况下满足编译器呢?谢谢。

EN

回答 1

Stack Overflow用户

发布于 2019-06-12 03:33:48

错误消息指出_menuMain_Strings_1标识了指向const数据的指针(它确实是这样做的),但是您正在使用它初始化指向非const数据的指针。您尚未提供这些类型的所有详细信息,但这与编译器丢弃限定符无关。相反,它是关于你的代码有一个const-qualification不匹配。

这种情况需要警告,因为如果指向的数据本身实际上被声明为const (与仅在指针中的限定相反),则尝试修改它会产生未定义的行为。当访问是通过原始的const-qualified指针时,编译器可以发现并拒绝它,但当访问是通过初始化_menuDef_Main_1时使用的非const-qualifed副本时,则不能。

我怎样才能在不给我警告的情况下满足编译器?

始终如一地使用const,否则根本不使用。请注意,它是病毒式的:您可以自由地应用const-qualification,但不能安全地删除它。假设您将需要修改MENU_DEFINITION的定义以适当地执行const,这可能需要您进行进一步的更改。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56550354

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档