В Интернете я не нашел ответов на этот вопрос, а за последние 4 месяца я просмотрел его дважды.
В MPLab v8.88 с использованием компилятора Hi-Tech ANSI C у меня есть эта строка кода:
const uint8 SUM_THRESHOLD_MIN = 15; /* comment edited out */
и я получаю предупреждение:
Warning [364] C:\*directory edited out* \ *filename_edited_out*.c; 273.35 attempt to modify object qualifed const
(извините за правки, но я чувствовал, что должен отредактировать личные, но лишние детали).
Это не мой код, и я бы просто использовал #define
, но другие хотят использовать const
(для тех, кто не знает: использование const
гарантирует правильное приведение типа значения и может избавить вас от некоторых странных проблем, связанных с приведением типов и типы данных; это не мой любимый способ сделать это, но это тоже неплохая идея).
const
В одном и том же блоке кода происходит несколько инициализаций, и все они выдают мне это предупреждение. Они находятся в файле .c, в функции void. У меня есть другие файлы с функциями void, в которых я инициализирую const uint8, и в этих файлах нет предупреждений. Я искал глобально и не нашел другого экземпляра переменной, кроме того, где она используется в функции void (так что нет никаких проблем с переопределением или чем-то подобным). Чтобы было ясно, эти константы не являются частью какой-либо структуры или чего-то странного, они просто объявлены в функции void в файле .c.
У меня uint8 правильно typedef'd, а не #define'd (см. комментарии).
Может ли кто-нибудь помочь мне избавиться от этого предупреждения?
РЕДАКТИРОВАТЬ: Если я вставлю один из const uint8 в другой файл .c сразу после const uint16, который не выдает ошибку, например:
const uint16 rate_bias_time_constant[NUM_RATE_CHANNELS][RATE_BIAS_STEP_MAX] =
{30,120,480,960, 300,120,180,240, 300,120,180,240 }; // comment edited out
const uint8 SUM_THRESHOLD_MIN = 15; /* comment edited out */
Я получаю предупреждение 364 в этом файле для этого const uint8, но не для const uint16. Если я изменю SUM_THRESHOLD_MIN с uint8 на uint16, я все равно получу предупреждение. Для полноты, если я изменю его со всех прописных на все строчные, я все равно получу предупреждение. Если я изменю строку, например:
const uint8 SUM_THRESHOLD_MIN[2] = {15,2}; /* comment edited out */
Предупреждения нет.
Я понял, и всем большое спасибо за помощь!
Объявления, которые не выдают предупреждения, являются либо массивами, либо объявлены статическими константами uint8/16. По какой-то причине компилятор Hi-Tech C нормально работает с const int/char, const uint8/16, которые являются массивами, но не с const uint8/16, если они не объявлены как static const uint8/16.
Вы должны понимать, что из-за странной архитектуры PIC16/18 квалификатор "const" является указанием поместить эту переменную во флэш-память вместо ОЗУ, а не указанием компилятору запретить ее изменение.
Если вы пытаетесь инициализировать значение автоматической переменной, которая является локальной для функции, то вы пытаетесь изменить ее во время выполнения, потому что она попытается записать это значение инициализации в переменную (которая хранится во Flash и поэтому не (легко) записываемый) каждый раз, когда функция выполняется. Причина, по которой это работает, когда переменная объявлена статической, заключается в том, что статические переменные, которые являются локальными для функций, инициализируются только один раз, поэтому у компилятора нет логической несогласованности, о которой можно было бы ныть. Я предполагаю, что массивы const обрабатываются одинаково.
Я думаю, что основная проблема заключается в ваших ожиданиях того, как CONST работает с этим компилятором на этом процессоре. Эти вещи не являются переменными, как вы, кажется, ожидаете от своего описания. Скорее всего, они реализованы как константы в программной памяти, которая по существу доступна только для чтения. Эти вещи нельзя изменить во время выполнения. Ошибка, которую вы получаете, вероятно, связана с кодом среды выполнения, пытающимся записать в CONST, а не в определение CONST.
Дэйв Твид
uint8
правильнымtypedef
или просто#define
?Боб
м.Алинь
Джо Хасс
Боб
Боб
пользователь28910
м.Алинь
Дэйв Твид
#pragma
s), которые отключают это конкретное предупреждение?Боб
Боб
Боб
Дэйв Твид
Боб
Дэйв Твид
Боб
Боб
пользователь28910
Дэйв Твид
воливейраджр
Боб