#define как с ними работать ? - страница 2

 
Vladimir Pastushak:

Собственно вопрос в теме. Никогда ранее не интересовался дефайнами, теперь хочу освоить.

Можно пару простых и пару сложных примеров ?

Больше интересует вопрос по скорости работы, есть ли смысл работать с дефайнами ?

В справке не нашёл примера создания функции, то же хотелось бы увидеть пример.

#define это команда препроцессору компилятора, который перед компиляцией заменяет одну запись другой. Следовательно на производительности это никак не сказывается, т.к. все расчеты происходят до компиляции. Пример, пусть Вам нужно будет найти максимум массива с помощью ArrayMaximum. Если максимум не найден функция вернет -1. Эту константу можно заменить на более выразительное:

#define SEARCH_FAILED -1
double array[];
if(ArrayMaximum(array) == SEARCH_FAILED)
   printf("Не удалось найти максимум в массиве. Проверьте содержимое массива.");

Надо однако понимать, что #define - это наследство от старых языков программирования. Сейчас использование #define надо избегать, или по крайней мере использовать очень ограничено, на уровне простых подстановок. Поэтому не пытайтесь учиться тому, от чего уже в цивилизованном мире программирования давно стараются отмежеваться. 

 
Vladimir Pastushak:

Спасибо!

А как сделать функцию ?

#define  dt Digits()
#define  pt Point()
#define  ND (nm)  
double dr (return NormalizeDouble((nm)*(pt),(dt))) 

например то что сейчас я кручу

никак не получается, сообразить не могу...

То, что Вы делаете, отличный способ убиться. Ни в коем случае так не пишите.

 

https://www.mql5.com/ru/docs/basis/preprosessor/constant - объяснение проще не бывает и примеры есть - даже я понял.

 
Всем спасибо!
 
Maxim Dmitrievsky:


http://www.codenet.ru/progr/cpp/Macros.php

return там не надо

в принципе-то для ф-й это наверное не так актуально, потмоу что ф-ии и так быстро и легко вызываются :)


Замечу, у каждой функции есть пролог и эпилог, то есть даже такая ф-я будет медленнее чистого кода. Я не призываю заменять функции макросами ))) просто для справки

int n = 0;
void f()
{
   n++;
}

n++; // будет быстрее функции
 
Vasiliy Sokolov:

#define это команда препроцессору компилятора, который перед компиляцией заменяет одну запись другой. Следовательно на производительности это никак не сказывается, т.к. все расчеты происходят до компиляции. Пример, пусть Вам нужно будет найти максимум массива с помощью ArrayMaximum. Если максимум не найден функция вернет -1. Эту константу можно заменить на более выразительное:

Надо однако понимать, что #define - это наследство от старых языков программирования. Сейчас использование #define надо избегать, или по крайней мере использовать очень ограничено, на уровне простых подстановок. Поэтому не пытайтесь учиться тому, от чего уже в цивилизованном мире программирования давно стараются отмежеваться. 


дефайн плох тем, что не имеет типа, рекомендуется использовать константы

const int n = 100;

**

 
Alexey Volchanskiy:

Замечу, у каждой функции есть пролог и эпилог, то есть даже такая ф-я будет медленнее чистого кода. Я не призываю заменять функции макросами ))) просто для справки


Не будет.

Код:

double n = 0;
long niteration = 10000000000;
void OnStart()
  {

   datetime from = TimeCurrent();
   for( long i = 0; i < niteration; i++ ){
      n++;
   }
   datetime to = TimeCurrent();
   Print("time for n++:", (long)(to-from), " n=", n  );
   from = to;
   for( long i = 0; i < niteration; i++ ){
      f();
   }
   to = TimeCurrent();
   Print("time for f():", (long)(to-from), " n=", n  );
  }
//+------------------------------------------------------------------+

void f()
{
   n++;
}

Результат:

2017.07.27 20:53:10.788 callf (MXI-9.17,M15) time for n++:27 n=10000000000.0

2017.07.27 20:53:37.014 callf (MXI-9.17,M15) time for f():26 n=20000000000.0

Код:

long n = 0;
long niteration = 10000000000;
void OnStart()
  {

   datetime from = TimeCurrent();
   for( long i = 0; i < niteration; i++ ){
      n++;
   }
   datetime to = TimeCurrent();
   Print("time for n++:", (long)(to-from), " n=", n  );
   from = to;
   for( long i = 0; i < niteration; i++ ){
      f();
   }
   to = TimeCurrent();
   Print("time for f():", (long)(to-from), " n=", n  );
  }
//+------------------------------------------------------------------+

void f()
{
   n++;
}


Результат:

2017.07.27 20:55:10.144 callf (MXI-9.17,M15) time for n++:0 n=10000000000

2017.07.27 20:55:10.144 callf (MXI-9.17,M15) time for f():0 n=20000000000


 
Ренат говорит, что простые маленькие функции компилятор инлайнит. Директивы #inlain в языке нет, он делает это автоматически
 
Alexey Volchanskiy:
Ренат говорит, что простые маленькие функции компилятор инлайнит. Директивы #inlain в языке нет, он делает это автоматически

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

Короче, попытки обыграть компьютер на его поле приводят к неизбежному проигрышу. #define штука опасная, не даром от нее отказались в современных ЯП. Если она и осталась то на уровне '#define DEBUG' не больше.

 
Vasiliy Sokolov:

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

Короче, попытки обыграть компьютер на его поле приводят к неизбежному проигрышу. #define штука опасная, не даром от нее отказались в современных ЯП. Если она и осталась то на уровнеляции, я часто используютакже на уровне условной  '#define DEBUG' не больше.


А также на уровне условной компиляции

void OnStart() 
  { 
   #ifdef __MQL5__ 
      #ifdef _DEBUG 
         Print("Hello from MQL5 compiler [DEBUG]"); 
      #else 
        #ifdef _RELEASE 
           Print("Hello from MQL5 compiler [RELEASE]"); 
        #endif 
     #endif 
   #else 
      #ifdef __MQL4__ 
         #ifdef _DEBUG 
           Print("Hello from MQL4 compiler [DEBUG]"); 
        #else 
           #ifdef _RELEASE 
              Print("Hello from MQL4 compiler [RELEASE]"); 
           #endif 
        #endif 
     #endif 
   #endif 
  }

**

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