警告:初始化会从指针目标类型[-Wdiscarded-qualifiers]中丢弃“ const”限定词

时间:2019-06-11 19:10:53

标签: c eclipse gcc mingw warnings

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

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 };
../menudefs.h:53:3: warning: initialization discards 'const' qualifier from pointer target type [-Wdiscarded-qualifiers]
   53 |   _menuMain_Strings_1, _menuMain_Fields_1 };
      |   ^~~~~~~~~~~~~~~~~~~

首先,我必须添加额外的 * const 以便生成一个十六进制文件来消除编译器错误。根据我的假设,编译器将丢弃 const 之一。在没有警告的情况下如何满足编译器的要求?谢谢。

1 个答案:

答案 0 :(得分:2)

错误消息指示_menuMain_Strings_1标识了指向const数据的指针(确实如此),但是您正在使用它来初始化指向非const数据的指针。您尚未提供这些类型的所有详细信息,但这与编译器丢弃限定符无关。而是关于您的代码具有const资格不匹配。

这种情况值得警告,因为如果指向的数据实际上实际上是声明为const(与仅在指针中的限定相反),则尝试对其进行修改会产生未定义的行为。当通过原始的const限定的指针进行访问时,编译器可以发现并拒绝它,但是当通过初始化了const的非经过_menuDef_Main_1限定的副本进行访问时,编译器则无法发现它

  

在没有警告的情况下如何满足编译器要求?

始终使用const或完全不使用。请注意,它具有病毒性:您可以自由应用const资格,但是不能安全地删除它。大概,您将需要修改MENU_DEFINITION的定义以适当地执行const,这可能需要您做进一步的更改。