我试图理解为什么我的编译器警告我这段代码:
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。我怎样才能在不给我警告的情况下满足编译器呢?谢谢。
发布于 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
,这可能需要您进行进一步的更改。
https://stackoverflow.com/questions/56550354
复制相似问题