предупреждение: инициализация отбрасывает квалификатор const из целевого типа указателя [-Wdiscarded-qualifiers] - PullRequest
0 голосов
/ 11 июня 2019

Я пытаюсь понять, почему мой компилятор предупреждает меня об этом коде:

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 Ответ

2 голосов
/ 11 июня 2019

Сообщение об ошибке указывает, что _menuMain_Strings_1 идентифицирует указатель на данные const (что он делает), но вы используете его для инициализации указателя на данные, отличные от const. Вы не представили все детали этих типов, но речь идет не о компиляторе, отбрасывающем квалификаторы. Скорее, речь идет о вашем коде с несоответствием const -квалификации.

Такая ситуация требует предупреждения, потому что, если на самом деле указываемые данные объявлены const (в отличие от того, что квалификация присутствует только в указателе), то попытка изменить их приводит к неопределенному поведению. Компилятор может определить это и отклонить, когда доступ осуществляется через исходный указатель, квалифицированный const, но не когда доступ осуществляется через не const квалифицированную копию, с которой инициализируется _menuDef_Main_1.

Как я могу удовлетворить компилятор без его предупреждения?

Используйте const последовательно или не используйте его вообще. И обратите внимание, что это вирус: вы можете свободно применять const -квалификацию, но вы не можете безопасно ее удалить. Предположительно, вам нужно будет изменить определение MENU_DEFINITION, чтобы оно соответствовало const соответствующим образом, и для этого может потребоваться внести дополнительные изменения.

...