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

warning: initialization discards 'const' qualifier from pointer target type [-Wdiscarded-qualifiers]

提问人:whitleystriber 提问时间:6/12/2019 更新时间:6/12/2019 访问量:1863

问:

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

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 才能生成十六进制文件以消除编译器错误。根据我的假设,编译器无论如何都会丢弃其中一个常量。我怎样才能在不给我警告的情况下满足编译器的要求?谢谢。

C Eclipse GCC MINGW 警告

评论

2赞 dbush 6/12/2019
如何定义?、、等呢?MENU_DEFINITION_menuMain_L1_menuMain_L2
1赞 jww 6/12/2019
您缺少太多代码。我得到的只是尝试编译代码的编译错误。 编译就好了。另请参阅如何创建最小、完整和可验证的示例static const char *const _menuMain_Strings_1[] = { "a", "bb", "ccc", "dddd" };-Wall

答:

3赞 John Bollinger 6/12/2019 #1

错误消息指示标识指向数据的指针(它确实如此),但您正在使用它来初始化指向非数据的指针。您尚未提供这些类型的所有详细信息,但这并不是关于编译器丢弃限定符的问题。相反,它是关于您的代码具有 -qualification 不匹配。_menuMain_Strings_1constconstconst

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

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

始终如一地使用或根本不使用。请注意,它是病毒式的:您可以自由申请 -qualification,但您不能安全地删除它。据推测,您将需要修改 的定义才能适当地进行,这可能需要您因此进行进一步的更改。constconstMENU_DEFINITIONconst