提问人:whitleystriber 提问时间:6/12/2019 更新时间:6/12/2019 访问量:1863
警告:初始化从指针目标类型中丢弃“const”限定符 [-Wdiscarded-qualifiers]
warning: initialization discards 'const' qualifier from pointer target type [-Wdiscarded-qualifiers]
问:
我试图理解为什么我的编译器警告我这段代码:
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 才能生成十六进制文件以消除编译器错误。根据我的假设,编译器无论如何都会丢弃其中一个常量。我怎样才能在不给我警告的情况下满足编译器的要求?谢谢。
答:
3赞
John Bollinger
6/12/2019
#1
错误消息指示标识指向数据的指针(它确实如此),但您正在使用它来初始化指向非数据的指针。您尚未提供这些类型的所有详细信息,但这并不是关于编译器丢弃限定符的问题。相反,它是关于您的代码具有 -qualification 不匹配。_menuMain_Strings_1
const
const
const
这种情况需要警告,因为如果指向的数据实际上本身已声明(而不是该限定仅在指针中),则尝试修改它会产生未定义的行为。当访问是通过原始的限定指针进行的时,编译器可以发现它并拒绝它,但当访问是通过初始化的非 --qualifed 副本时,编译器就不能了。const
const
const
_menuDef_Main_1
我怎样才能在不给我警告的情况下满足编译器的要求?
始终如一地使用或根本不使用。请注意,它是病毒式的:您可以自由申请 -qualification,但您不能安全地删除它。据推测,您将需要修改 的定义才能适当地进行,这可能需要您因此进行进一步的更改。const
const
MENU_DEFINITION
const
评论
MENU_DEFINITION
_menuMain_L1
_menuMain_L2
static const char *const _menuMain_Strings_1[] = { "a", "bb", "ccc", "dddd" };
-Wall