我试图理解为什么我的编译器向我警告此代码:
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 之一。在没有警告的情况下如何满足编译器的要求?谢谢。
答案 0 :(得分:2)
错误消息指示_menuMain_Strings_1
标识了指向const
数据的指针(确实如此),但是您正在使用它来初始化指向非const
数据的指针。您尚未提供这些类型的所有详细信息,但这与编译器丢弃限定符无关。而是关于您的代码具有const
资格不匹配。
这种情况值得警告,因为如果指向的数据实际上实际上是声明为const
(与仅在指针中的限定相反),则尝试对其进行修改会产生未定义的行为。当通过原始的const
限定的指针进行访问时,编译器可以发现并拒绝它,但是当通过初始化了const
的非经过_menuDef_Main_1
限定的副本进行访问时,编译器则无法发现它
在没有警告的情况下如何满足编译器要求?
始终使用const
或完全不使用。请注意,它具有病毒性:您可以自由应用const
资格,但是不能安全地删除它。大概,您将需要修改MENU_DEFINITION
的定义以适当地执行const
,这可能需要您做进一步的更改。