Цитата(Forger @ Aug 6 2018, 00:09)

От себя добавлю: лучше использовать volatile непосредственно при объявлении/создании объекта (переменной), а не вставлять его при объявлении типа данных.
Это позволяет дать возможность компилятору оптимизировать те куски кода, где это действительно нужно, а точнее - только с теми объектами, которые явно указаны, что они volatile.
В противном случае этот typedef с "внедренным" volatile может оказаться в коде там, где volitile окажется даже вредным. Явно это не увидите.
Спасибо. Действительно так и есть. Если убрать volatile из объявления типа и вставлять его только перед требующими того ОБЪЕКТАМИ, то предупреждения исчезают.
Цитата(Сергей Борщ @ Aug 6 2018, 08:48)

Ему не нрвится передача volatile enum качестве параметра NewFlsgState и возврат результата в виде volatile enum. Подумайте сами - что означает volatile и как его компилятор должен трактовать в типе параметра и возвращаемого значения? Фактически вам volatile нужен только для MyFlag1 и MyFlag2, поэтому уберите volatile из объявления перечисления и добавьте к объявлению MyFlag1 и MyFlag2. Этим вы заодно дадите компилятору свободу оптимизировать весь остальной код, не связанный с непосредственным обращением к MyFlag1 и MyFlag2.
Тоже согласен.
НО! Вот исправленный код, на который у компилятора нет предупреждений. Обратите внимание, что параметры функций имеют спецификатор volatile. Без них компилятор выдаёт ошибки о несоответствии типов аргументов декларированных и переданных.
Код
// Тип состояния флага события
typedef enum {
FLAG_STATE_OFF = 0, // Флаг события сброшен
FLAG_STATE_ON = 1 // Флаг события взведён
} Flag_State_t;
// Получить значение флага события по указателю на него
Flag_State_t GetFlagState (volatile Flag_State_t *Flag_ptr) {return *Flag_ptr;}
// Установить заданное значение флага события по указателю на него
void SetFlagState (volatile Flag_State_t *Flag_ptr,Flag_State_t NewFlagState) {
*Flag_ptr=NewFlagState;
};
// Глобальные объекты - флаги событий
volatile Flag_State_t MyFlag1, MyFlag2;
int main (){
SetFlagState (&MyFlag1,FLAG_STATE_ON); // MyFlag1=FLAG_STATE_ON;
MyFlag2=GetFlagState (&MyFlag1); // MyFlag2=MyFlag1;
while(1);
}
А если перед типом возвращаемого значения функции GetFlagState добавить volatile, то получим другое предупреждение компилятора: warning: #815-D: type qualifier on return type is meaningless
Это уже как раз то, о чём вы сказали.
Вообще, из 10 ответов только 2 реально по теме. КПД 20%
Для остальных 80%.
Да, код убогий, глупый и никчёмный. Не имеющий никакого практического смысла и применения. Но!!! Задача его была показать суть проблемы, написав при этом минимум строк кода. Чтобы не отвлекать отвечающих СТРОГО ПО-СУЩЕСТВУ ЗАДАННОГО ВОПРОСА на второстепенные детали. И двое из десяти это поняли, и ответили действительно по-существу.