Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/18: Рейтинг темы: голосов - 18, средняя оценка - 4.83
Почемучка)
1243 / 303 / 30
Регистрация: 23.12.2010
Сообщений: 2,000
Записей в блоге: 1
1

Устронить уведомление: Functions containing switch are not expanded inline

11.03.2012, 22:25. Просмотров 3731. Ответов 12
Метки нет (Все метки)

Вот такое уведмление
[C++ Warning] Unit1.h(67): W8027 Functions containing switch are not expanded inline
[C++ Warning] Unit1.h(67): W8027 Functions containing switch are not expanded inline
[C++ Warning] Unit1.h(67): W8027 Functions containing switch are not expanded inline
[C++ Warning] Unit1.h(67): W8027 Functions containing switch are not expanded inline
сам код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include "trayicon.h"
#include <windows.h>
#include <dbt.h>
#include <Menus.hpp>
#include <ImgList.hpp>
#include <ExtCtrls.hpp>
#include <Graphics.hpp>
#include <AppEvnts.hpp>
#include <ComCtrls.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:    // IDE-managed Components
        TTrayIcon *TrayIcon1;
        TPopupMenu *PopupMenu1;
        TMenuItem *N2;
        TMenuItem *N3;
        TMenuItem *N4;
        TImageList *ImageList1;
        TGroupBox *GroupBox1;
        TMemo *memo;
        TButton *Button1;
        TComboBox *ComboBox1;
        TEdit *Edit1;
        TLabel *Label1;
        TImage *Image1;
        TMenuItem *N5;
        TButton *Button2;
        TButton *Button3;
        TButton *Button4;
        TImage *Image2;
        TMenuItem *N6;
        TApplicationEvents *ApplicationEvents1;
        TMenuItem *N1;
        void __fastcall N2Click(TObject *Sender);
        void __fastcall N4Click(TObject *Sender);
        void __fastcall FormActivate(TObject *Sender);
        void __fastcall N3Click(TObject *Sender);
        void __fastcall Button1Click(TObject *Sender);
        void __fastcall N5Click(TObject *Sender);
        void __fastcall Button2Click(TObject *Sender);
        void __fastcall Button4Click(TObject *Sender);
        void __fastcall Button3Click(TObject *Sender);
        void __fastcall Image1Click(TObject *Sender);
        void __fastcall FormCloseQuery(TObject *Sender, bool &CanClose);
        void __fastcall N6Click(TObject *Sender);
        void __fastcall ComboBox1DropDown(TObject *Sender);
        void __fastcall ComboBox1Select(TObject *Sender);
        void __fastcall TrayIcon1Restore(TObject *Sender);
        void __fastcall FormClose(TObject *Sender, TCloseAction &Action);
        void __fastcall FormShow(TObject *Sender);
        void __fastcall ApplicationEvents1Message(tagMSG &Msg,
          bool &Handled);
        void __fastcall N1Click(TObject *Sender);
private:    // User declarations
void virtual __fastcall WMDeviceChange(TMessage &Message);
public:
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(WM_DEVICECHANGE,TMessage,WMDeviceChange);
END_MESSAGE_MAP(TForm);
 
        __fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
и конкретно 67 строка

C++
1
2
3
4
5
6
private:    // User declarations
void virtual __fastcall WMDeviceChange(TMessage &Message);
public:
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(WM_DEVICECHANGE,TMessage,WMDeviceChange);
END_MESSAGE_MAP(TForm);
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.03.2012, 22:25
Ответы с готовыми решениями:

W8027 Functions containing some return statements are not expanded inline
Доброй ночи. Я этот вопрос уже задавал - но всё же хочу попробовать устранить это предупреждение......

Ошибка W8026 Functions with exception specifications are not expanded inline
class ExpRDMS: public std::exception { private: __int16 stat; String...

как устронить переадресацию
сидел в универе со своим ноутом))) подключил их кабель локальный они используют прокси сервер...

GCC Inline Assembly перевести в Visual Studio Inline Assembler
Здравствуйте. Есть код на GCC Inline Assembly и его нужно перевести в Visual Studio Inline...

12
287 / 228 / 27
Регистрация: 13.06.2010
Сообщений: 744
12.03.2012, 10:59 2
А зачем вам тут виртуальная функция?
Попробуйте без virtual
0
870 / 447 / 35
Регистрация: 25.10.2011
Сообщений: 910
12.03.2012, 11:41 3
Данный варнинг встречал весьма часто в BCB6, причем иногда он срабатывает на dialogs.hpp и т.п. А сам варнинг связан с использованием директив препроцессора и ругается в случае "некорректного" использования (последнее прошу уточнить уважаемых знатоков, ибо не помню точную зависимость).
Можно записать иначе:
C++
1
2
3
4
5
6
7
8
9
void __fastcall Dispatch(void * Message)
{
  TMessage * Msg = (TMessage*)Message;
  switch(Msg->Msg)
  {
    case WM_DEVICECHANGE: WMDeviceChange(Message); break;
    default: TWinControl::Dispatch(Message); break;
  }
}
Более точная расшифровка должна быть в хелпе. Или просто отрубить данный варнинг.
0
Почемучка)
1243 / 303 / 30
Регистрация: 23.12.2010
Сообщений: 2,000
Записей в блоге: 1
15.04.2012, 17:02  [ТС] 4
Не чего не помогает, есть другие варианты?
0
LK
Заблокирован
15.04.2012, 17:07 5
C++
1
2
3
4
5
protected:
  void virtual __fastcall WMDeviceChange(TMessage &Message);
  BEGIN_MESSAGE_MAP
  MESSAGE_HANDLER(WM_DEVICECHANGE,TMessage,WMDeviceChange);
  END_MESSAGE_MAP(TForm);
0
Почемучка)
1243 / 303 / 30
Регистрация: 23.12.2010
Сообщений: 2,000
Записей в блоге: 1
15.04.2012, 17:19  [ТС] 6
Цитата Сообщение от LK Посмотреть сообщение
protected:
void virtual __fastcall WMDeviceChange(TMessage &Message);
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(WM_DEVICECHANGE,TMessage,WMDeviceChange);
END_MESSAGE_MAP(TForm);
Все ровно эта ошибка
0
LK
Заблокирован
15.04.2012, 17:28 7
Functions containing резервируемое_слово are not expanded inline
Предупреждение этапа компиляции (функции, содержащие резервируемое_слово не могут быть подставляемыми)

Функции, содержащие резервируемые слова do, for, while, goto, switch, break, continue и case, не могут быть подставляемыми, даже при наличии задания их как inline. Функция может использоваться, но будет рассматриваться как обычная статическая (не глобальная) функция. Копия этой функции будет находиться в любой единице компиляции, где она вызывается.
я не обратил внимание, что это Warning, сиречь, предупреждение, забей.
0
Почемучка)
1243 / 303 / 30
Регистрация: 23.12.2010
Сообщений: 2,000
Записей в блоге: 1
15.04.2012, 17:29  [ТС] 8
Цитата Сообщение от DefineTrueFalse Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
void __fastcall Dispatch(void * Message)
{
  TMessage * Msg = (TMessage*)Message;
  switch(Msg->Msg) {
    case WM_DEVICECHANGE: WMDeviceChange(Message); break;
    default: TWinControl::Dispatch(Message); break;
  }
}
и этот код не работает

Добавлено через 47 секунд
Цитата Сообщение от LK Посмотреть сообщение
я не обратил внимание, что это Warning, сиречь, предупреждение, забей.
А убрать его с отчета можно?
0
LK
Заблокирован
15.04.2012, 17:36 9
А что это изменит? Как страус - голову в асфальт? Лучше уж видеть, что там творится. Во всяком случае, я делаю так.
А отключить можно все - покопавшись в настройках билдера.
0
Почемучка)
1243 / 303 / 30
Регистрация: 23.12.2010
Сообщений: 2,000
Записей в блоге: 1
15.04.2012, 17:38  [ТС] 10
Цитата Сообщение от LK Посмотреть сообщение
А что это изменит?
Программа идет как дипломный проэкт, могут прикопаться и сказать...вот предупреждения, прога кривая и т.д...
0
LK
Заблокирован
15.04.2012, 18:19 11
EdarGp, на месте препода я бы первым делом включил все, что возможно .
Ну да, вам виднее, хотя относительно данного предупреждения ответ у вас как бы есть (это).
0
Практикантроп
4578 / 2524 / 465
Регистрация: 23.09.2011
Сообщений: 5,420
29.04.2012, 04:44 12
Цитата Сообщение от EdarGp Посмотреть сообщение
А убрать его с отчета можно?
чтоб "по тихому" можно перед BEGIN_MESSAGE_MAP вставить #pragma option push -vi- и не забыть после END_MESSAGE_MAP вставить #pragma option pop . То-есть типа такого...
C++
1
2
3
4
5
#pragma option push -vi-
BEGIN_MESSAGE_MAP
VCL_MESSAGE_HANDLER(WM_SIZE, TWMSize, WMSize);
END_MESSAGE_MAP(TCustomGrid);
#pragma option pop
или в свойствах проекта:
Project->Options->Compiler->Disable Inline expansions
2
1436 / 1109 / 344
Регистрация: 11.04.2011
Сообщений: 2,613
12.02.2013, 06:41 13
Прекрасно понимаю, что диплом уже защищен. Надеюсь, что на отлично. Тем не менее, решил собрать все воедино. Чтобы те, кто наткнутся на эту тему в будущем, в размышлениях, от куда взялся этот Warning, и как его убрать, обладали всей информации. Как отметил LK, этот Warning возникает тогда. когда в inline функции встречаюся циклы или switch. BEGIN_MESSAGE_MAP-MESSAGE_HANDLER-END_MESSAGE_MAP - это набор макросов, вместо которых при компиляции подставляется код, примерно написанный в сообщении DefineTrueFalse. А так, как этот код будет находится внутри описания класса, то объявленная функция будет являеться inline-функцией. Поэтому и возникает Warning.

При использовании вышеописанных макросов есть 2 варианта:
1. Понять и простить и не обращать внимания на Warning. (Компилятор все равно воспримет эту функцию как обычную, а не как inline).
2. Скрыть его, чтобы не раздражал. В теме описано несколько способов. Можно выбрать любой.

Если отказаться от макросов, и писать код в первозданном виде, то без Warning'а можно написать так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class TForm1 : public TForm
{
// какой то код
public:
// какой то код
    virtual void __fastcall WMDeviceChange(TMessage&);
    virtual void __fastcall Dispatch(void*);
//какой то код
};
//какой то код
void __fastcall TForm1::Dispatch(void* Message)
{
    switch((PMessage)Message)->Msg)
    {
    case WM_DEVICECHANGE: WMDeviceChange(*(TMessage*)Message);
        break;
    default: TForm->Dispatch(Message);
        break;
    }
}
//какой то код
3
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.02.2013, 06:41

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Inline функции - на сколько должна быть маленькая функция, чтоб она подошла под inline?
Здравствуйте. Знаю теорию, но не понимаю, на сколько должна быть маленькая функция, чтоб она...

inline функции vs инструкции inline функций
Здравствуйте. Чтобы не писать повторно код, нужно использовать функции. Но если функции компактные,...

Expanded listview
Всем привет! Возможно ли в Delphi такое: - ?.. Только вложенность (иерархий) может быть...

Зависает приложение в событии Expanded в объекте Expander
Я встретился с такой проблемой, у меня есть Expander в котором есть TextBlock. Expander имеет...

Событие Expanded у TreeView.Item срабатывает несколько раз
Доброго времени суток форумчанам) Возникла следующая проблема - при разворачивании Item'a в моём...

Как сделать чтобы Switch работал в другом Switch'e?
Как сделать что бы Switch работал в другом Switch'e? Вот допустим выбираем один пункт и в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.