Область видимости и время жизни переменных. Или - MQL5 в MT4 и MQL5 в MT5 - одно и тоже или нет?

 

В справочнике по MQL4 и MQL5 раздел "Область видимости и время жизни переменных" абсолютно одинаков. И, вроде как, в MT4 можно использовать программы написанные на MQL5.

Вопрос: Почему абсолютно одинаковый код на MQL5 компилируется по разному в MT4 и MT5?

 --------------

class cClass

  {

   public:

   cClass(void) {};

   void mClass();

   ~cClass(void) {};

  };


void cClass::mClass(void)

  {

   char param=1;

   switch(param)

     {

      case 0: {char i; i=0;}

      case 1: {char i; i=1;}  //Ошибка - 'i' - variable already defined

      default:

         return;

     }

   return;

  }

 --------------

В MetaEditor от MT5 все прекрасно, а вот в MT4 данный код не компилируется и выдает ошибку - 'i' - variable already defined.

Версии MT последние. Если я правильно понимаю, то результат компиляции должен быть одинаковым и там, и там. Но получается, что я чего-то не понимаю.

Объясните, пожалуйста, это так задумано или ...? В чем отличия MQL5 для разных версий MT?

 
в мт4 надо #property stirct 
 

#property strict  здесь не поможет.

Да, в компиляторе МТ4 не совсем строго выдерживается правило видимости переменных.

На мой взгляд, здесь должен быть варнинг - подобные двойные объявления в разных блоках одной и той же переменной могут быть связаны с логическими ошибками, и компилятор о них должен предупреждать. Однако, код здесь должен быть валидным.

 
Laryx:

#property strict  здесь не поможет.

Прежде чем заявлять, проверьте сами. Все нормально компилируется

#property strict
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
class cClass
  {
public:
                     cClass(void) {};
   void              mClass();
                    ~cClass(void) {};
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void cClass::mClass(void)

  {
   char param=1;
   switch(param)
     {
      case 0: {char i; i=0;}
      case 1: {char i; i=1;}  //нет никакой ошибки
      default:
         return;
     }
   return;
  }
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---

  }
//+------------------------------------------------------------------+
 
Rosh:

Прежде чем заявлять, проверьте сами. Все нормально компилируется

У меня раньше не помогало, я точно помню, нарывался на такую же ошибку (с самого начала всегда использую strict).

Значит, это уже исправили.

 
#property strict помогает, все работает.
Всем спасибо за помощь.