OOP, plantillas y macros en mql5, sutilezas y usos - página 17

 
Taras Slobodyanik:

¿Las macros devuelven valores?

Bien, aquí hay un ejemplo de código

#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:

Bien, aquí hay un código de muestra

La sustitución de macros significa que todo ese código (que está en la definición), será sustituido cada vez en un lugar específico del programa. De hecho, en lugar de hacer una función y llamarla, se copia esta función dentro del código muchas veces, como un trozo de código.

Y si haces elretorno de una macro, es elretorno de todo el código donde se inserta esta macro.

 
Taras Slobodyanik:

La sustitución de macros significa que todo el código (que está en la definición), será sustituido cada vez en el lugar especificado en el programa. De hecho, en lugar de hacer una función y llamarla, se copia esta función dentro del código muchas veces, como un trozo de código.

Y si haces elretorno de una macro, este es el retorno de todo el código donde se inserta esta macro.

Resulta que no se puede escribir una función macro.

 
Seric29:

Resulta que no hay manera de escribir una función macro.

Una macro sustitución es la sustitución de un texto por otro (en el código fuente), no puede ser una función por definición.

 
Escriba su opinión sobre estehttps://www.mql5.com/ru/forum/160683/page945#comment_12958065(número 9448)
 

Como escribir 2 macros sin saltar a una nueva línea aumenta mucho el número de líneas, lo que alarga mucho el programa, he aquí un ejemplo

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

La macro B ya no funciona.

 

¿es posible convertir un nombre de variable en una cadena?

No funciona así:

#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:
Chicos, quiero escribir una macro de makros(a) y que funcione así: si a es igual a 1, devolverá cualquier valor de tipo int, si a es igual a 2, devolverá cualquier valor de tipo double, si a es igual a 3, devolverá cualquier valor de tipo bool. ¿Es posible hacerlo?

¿Para qué? ¿Para qué? ¿Dónde lo vas a utilizar?

 
Igor Makanu:

¿es posible convertir un nombre de variable en una cadena?

#define  p_func(NAME)  Print("This is " + #NAME)
 
Seric29:
Chicos esta pregunta quiero escribir una macro makros(a), funcionará así: si a es igual a 1ce entonces la macro devolverá cualquier valor de tipo int, si a es igual a 2ke entonces la macro devolverá cualquier valor de tipo double, si a es igual a 3ke entonces la macro devolverá cualquier valor de tipo bool. ¿Es posible hacerlo?
#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));
}

En µl, se puede prescindir de GET_EXPAND, pero es algo específico de µl, es más correcto. Y las macros µl están muy limitadas por la falta del operador coma (aunque por muletillas...).

ZZY: y todo es en tiempo de compilación, por supuesto.

ZZZY: por cierto, si hubiera un operador fantasma, podrías hacer esto:

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;     // ...