реклама на сайте
подробности

 
 
> Warning: #962-D: use of a type with no linkage to declare a function, О чем предупреждает Кейл? Что ему не нравится?
Professor Chaos
сообщение Aug 5 2018, 19:53
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 60
Регистрация: 25-08-17
Пользователь №: 98 970



Простенький пример проекта из одного main.cpp файла
Код
// Файл main.cpp
// Тип состояния флага события
typedef volatile enum {
  FLAG_STATE_OFF         = 0,    // Флаг события сброшен
  FLAG_STATE_ON            = 1    // Флаг события взведён
} Flag_State_t;

// Получить значение флага события по указателю на него
Flag_State_t GetFlagState (const Flag_State_t *Flag_ptr) {return *Flag_ptr;}

// Установить заданное значение флага события по указателю на него
void SetFlagState (Flag_State_t *Flag_ptr,Flag_State_t NewFlsgState) {
  *Flag_ptr=NewFlsgState;
};

// Глобальные объекты - флаги событий
Flag_State_t MyFlag1, MyFlag2;                        



int main () {    
    
  SetFlagState (&MyFlag1,FLAG_STATE_ON);  // MyFlag1=FLAG_STATE_ON;
  MyFlag2=GetFlagState (&MyFlag1);             // MyFlag2=MyFlag1;
  while(1);
}


Компиляция выдает 2 предупреждения на функции GetFlagState и SetFlagState :
Цитата
warning: #962-D: use of a type with no linkage to declare a function

Если в объявлении типа Flag_State_t убрать volatile - предупреждения исчезнут.
Вопрос: о чём предупреждает Кейл? Чем ему не нравится volatile в определении типа Flag_State_t ?

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

По логике работы программы volatile необходим, т.к. флаги событий взводятся в функциях обработки прерываний, а сбрасываются и проверяются в основном цикле программы. Без него нельзя, иначе компилятор может некорректно оптимизировать код и программа не будет работать, как ей положено.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
VladislavS
сообщение Aug 6 2018, 07:02
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 475
Регистрация: 14-04-05
Из: Москва
Пользователь №: 4 140



А если ещё вспомнить, что typedef уже заменили на using sm.gif

PS: Краткость - сестра таланта.
Код
volatile bool MyFlag1, MyFlag2;                        

int main () {    
  MyFlag1 = true;
  MyFlag2 = MyFlag1;
  for(;;);
}
Go to the top of the page
 
+Quote Post
Forger
сообщение Aug 6 2018, 10:05
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831



Цитата(VladislavS @ Aug 6 2018, 10:02) *
А если ещё вспомнить, что typedef уже заменили на using sm.gif

Он есть начиная лишь с C++11. В штатном компиляторе кейла V5 нужно в опциях компилятора добавлять соотв. ключик "--cpp11", а в V6 это уже не требуется.

Считаю using крайне полезной штукой! А точнее, тут более полезно наличие знака "=", именно он делает запись очень понятной с ходу, а не как это идет в typedef:
Вот для примера сравните две записи:
Код
typedef unsigned long int MyType;

Код
using MyType = unsigned long int;



Если же этих записей using много, то код становится еще более читаемым и понятным.
Вот пример из моего кода ("OS wrapper for cmsis_os2 (Keil RTX)"):

Код
    
class AbstractThread
{
public:
    using Handle       = osThreadId_t;
    using ControlBlock = osRtxThread_t;
    using Body         = osThreadFunc_t;
    using Priority     = osPriority_t;
    using StackItem    = uint64_t;
    using StackSize    = uint32_t;
    using NotifyValue  = uint32_t;
    using TimeMs       = uint32_t;
...


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Professor Chaos   Warning: #962-D: use of a type with no linkage to declare a function   Aug 5 2018, 19:53
- - Forger   Цитата(Professor Chaos @ Aug 5 2018, 22:5...   Aug 5 2018, 21:09
|- - jcxz   Цитата(Forger @ Aug 6 2018, 00:09) ...   Aug 6 2018, 04:48
||- - Forger   Цитата(jcxz @ Aug 6 2018, 07:48) Глобальн...   Aug 6 2018, 05:09
|- - Professor Chaos   Цитата(Forger @ Aug 6 2018, 00:09) От себ...   Aug 6 2018, 18:31
|- - Forger   Цитата(Professor Chaos @ Aug 6 2018, 21:3...   Aug 6 2018, 18:37
||- - Professor Chaos   Цитата(Forger @ Aug 6 2018, 21:37) Так эт...   Aug 6 2018, 19:57
||- - Forger   Цитата(Professor Chaos @ Aug 6 2018, 22:5...   Aug 6 2018, 20:14
||- - jcxz   Цитата(Professor Chaos @ Aug 6 2018, 22:5...   Aug 7 2018, 06:07
|- - Сергей Борщ   QUOTE (Professor Chaos @ Aug 6 2018, 21:3...   Aug 7 2018, 00:27
|- - VladislavS   Цитата(Professor Chaos @ Aug 6 2018, 21:3...   Aug 7 2018, 01:41
|- - Professor Chaos   Цитата(VladislavS @ Aug 7 2018, 04:41) в ...   Aug 7 2018, 02:35
- - VladislavS   Добавлю лишь, что в C++ для объявления типа перечи...   Aug 6 2018, 02:45
|- - Arlleex   Цитата(VladislavS @ Aug 6 2018, 06:45) До...   Aug 6 2018, 04:54
|- - jcxz   Цитата(Arlleex @ Aug 6 2018, 07:54) А мож...   Aug 6 2018, 06:49
|- - Arlleex   Цитата(jcxz @ Aug 6 2018, 10:49) В си++ к...   Aug 6 2018, 07:46
- - Сергей Борщ   QUOTE (Professor Chaos @ Aug 5 2018, 22:5...   Aug 6 2018, 05:48
- - VladislavS   Форма записи это всё шелуха и вкусовщина. Главное ...   Aug 6 2018, 10:23
- - VladislavS   Не надо нас лечить, лучше принимайте советы к испо...   Aug 7 2018, 02:59
- - VladislavS   Хотел промолчать, но не буду. У человека, который ...   Aug 7 2018, 06:24
|- - Forger   Мне одному кажется, что эта тема к Keil как таково...   Aug 7 2018, 07:31
|- - IgorKossak   Цитата(Forger @ Aug 7 2018, 10:31) Мне од...   Aug 7 2018, 18:44
- - Professor Chaos   Цитата(VladislavS @ Aug 7 2018, 09:24) Хо...   Aug 7 2018, 19:33


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 28th July 2025 - 12:33
Рейтинг@Mail.ru


Страница сгенерированна за 0.01395 секунд с 7
ELECTRONIX ©2004-2016