ООП, шаблоны и макросы в mql5, тонкости и приёмы использования - страница 17

 
Taras Slobodyanik:

а разве макросы возвращают значения?

Ну вот пример кода

#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#define N    0.0
#define S    0


  double Try_helper;
#define Try(EXPR, MES)               \
   Try_helper = EXPR;                \
   if (Try_helper <= 0.0) {          \
     printf("Error: %s ", MES);      \
     return 4;                         \
   }

int OnInit()
  { int qw=S; 

   return(INIT_SUCCEEDED);}
  
 
Seric29:

Ну вот пример кода

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

И если делаете return из макроса, то это  return из всего кода, где этот макрос вставлен.

 
Taras Slobodyanik:

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

И если делаете return из макроса, то это  return из всего кода, где этот макрос вставлен.

Получается что написать макрофункцию не получиться.

 
Seric29:

Получается что написать макрофункцию не получиться.

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

 
Напишите своё мнение по этому вопросу https://www.mql5.com/ru/forum/160683/page945#comment_12958065 (номер 9448)
 

Как написать 2 макроса без перехода на новую строку это очень сильно увеличивает количество строк что сильно удлинняет программу, вот пример

#define I int #define B bool//это просто пример ни в коем случае не воспринимайте всерьёз

Макрос В уже не работает.

 

возможно ли  имя переменной преобразовать в строку?

так не работает:

#define p_func(NAME)  Print("This is ##NAME")
//+------------------------------------------------------------------+
void OnStart()
{
   int QWERTY;
   int zxcvbn;
   p_func(QWERTY);	//This is ##NAME
   p_func(zxcvbn);	//This is ##NAME
}
 
Seric29:
Ребята такой вопрос я хочу написать макрос makros(a), работать он будет так: если а будет равно 1це то макрос вернёт любое значение типа int, если а будет равно 2ке то макрос вернёт любое значение типа double, если а будет равно 3ке то макрос вернёт любое значение типа bool. Возможно ли так сделать?

Зачем? Для чего? Где вы его собираетесь использовать?

 
Igor Makanu:

возможно ли  имя переменной преобразовать в строку?

#define p_func(NAME)  Print("This is " + #NAME)
 
Seric29:
Ребята такой вопрос я хочу написать макрос makros(a), работать он будет так: если а будет равно 1це то макрос вернёт любое значение типа int, если а будет равно 2ке то макрос вернёт любое значение типа double, если а будет равно 3ке то макрос вернёт любое значение типа bool. Возможно ли так сделать?
#define GET_HELPER_1 1
#define GET_HELPER_2 1.0
#define GET_HELPER_3 true
#define GET_EXPAND(I) GET_HELPER_##I
#define GET(I) GET_EXPAND(I)

void OnStart() {
   Alert(GET(1), "  ", GET(2), "  ", GET(3));
}

В мкл можно обойтись без GET_EXPAND, но это мкл специфичная фигня, правильней так. Ну и мкл макросы очень ограничены из-за отсутствия оператора запятая (хотя через костыли ...).

ЗЫ: ну и это всё compile time, естественно.

ЗЗЫ: кстати, если бы был оператор приведения то можно так:

class Q{
public:
        operator int();
        operator double();
        operator bool();
};
...
Q q;
int i = q;      // call operator int
double d = q;   // call operator double
bool b = q;     // ...
Причина обращения: