Условная компиляция

 

Хорошая новость.

//#define _hide_(x , y, z)  x  // работает!
//#define _hide_(x , y, z)  y  // работает!
#define _hide_(x , y, z)  z  // работает!

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
    
_hide_  
(  
         Print("Привет!");    
,
         Print("Пока!");
,
         Print("Всё понятно?");
)
  }
Файлы:
Hide-Test.mq5  2 kb
 

Чего молчим?  Никому не нада?  :)

Вот практичный пример.  Всё работает.

#define RANGE_CHECK(x)           // Если строка пуста - проверки изымаются из кода
//#define RANGE_CHECK(x)     x     // Если в строке x - задефайненный код обрабатывается

#define i2s IntegerToString

.................
...........

// присваивание значений
bool              Set(int i,int j,float Value)
     {
RANGE_CHECK
(      
      if(i>=0 && j>=0 && i<_size_L && j<_max_R) 
)  // End RANGE_CHECK      
       { _a[i*_size_R+j]=Value; return true; }
RANGE_CHECK
(      
      else { Print(__FUNCTION__+" : Ошибка индексации ["+i2s(i)+":"+i2s(j)+"]"); return false; }
)  // End RANGE_CHECK      
     }
// получение значений
float    const    Get(int i,int j)
     {
RANGE_CHECK
(      
       if(i>=0 && j>=0 && i<_size_L && j<_max_R)
)  // End RANGE_CHECK      
          return   _a[i*_size_R+j];
RANGE_CHECK
(      
       else
        {
         Print(__FUNCTION__+" : Ошибка индексации ["+i2s(i)+":"+i2s(j)+"]");
         return((float)EMPTY_VALUE);
        }
)  // End RANGE_CHECK      
     }

Можно определять различные макросы для скрытия частей кода. 

Типичный случай - различные проверки, которые замедляют, НО во время отладки лучше шоб были.

А вот когда отлажено - можно и ускориться - за счёт отключения избыточных проверок.

 

отличная находка .

про целые блоки моя мысль не дошла.

хотя нечто похожее активно используется в Controls стандартной либы

 
sergeev:

отличная находка .

про целые блоки моя мысль не дошла.

хотя нечто похожее активно используется в Controls стандартной либы

Я сам только сегодня обнаружил, что можно скобки макросов расставлять в разных строчках.  Блин ваще такого не ожидал, попробовал чисто на авось. :)
 

А #ifdef еще нету?

Но действительно - очень интересно.

 
Mathemat:

А #ifdef еще нету?

вместо #ifdef в MQL5 применяются  //

:)

 
Mathemat:

А #ifdef еще нету?

Увы. Не раз прошено. 

_______


#define __DEBUG(x) x
#define __RELEASE(x)


// завязка № раз
#define PERFORM(x) __MODE(x)


void assert(bool x)
{
   if (!x) DebugBreak();
}

// завязка № два
#define ASSERT(x) __MODE({assert(x);})

// единственное задание мода
#define __MODE(x) __RELEASE(x)

void OnStart()
{
   ASSERT(false);
   PERFORM(Print("Assertion failed!");)
}

// пошел свои ассерты переписывать )


 
TheXpert: // пошел свои ассерты переписывать )
Так, мне нужно определенное время, чтобы это усвоить :)
 
Mathemat:
Так, мне нужно определенное время, чтобы это усвоить :)

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

Не #ifdef конечно, далеко не так гибко, но пока пойдет.

У меня в коде завязка на debug release которую я так хотел, но что-то не соображалось, пока вот Владимир носом не ткнул :)

 
TheXpert: Суть в том, чтобы строить все условные макросы на простой базовой конструкции, так, чтобы можно было переключиться изменением в одной строке.

Это-то понятно.

Так можно и профайлер соорудить.

 
TheXpert:

У меня в коде завязка на debug release которую я так хотел, но что-то не соображалось, пока вот Владимир носом не ткнул :)

Возможный  вариант для дебаг/релиз :

#define _MODE_(DEBUG, RELEASE)    DEBUG    

...........
..
_MODE_
(  // debug-code
     ...
    ........................

  // end debug-code
, // release-code
    .......
    .................
)  // end release code


Причина обращения: