OOP, modelli e macro in mql5, sottigliezze e usi - pagina 17

 
Taras Slobodyanik:

Le macro restituiscono valori?

Bene, ecco un esempio di codice

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

Bene, ecco un codice di esempio

Sostituzione macro significa che tutto quel codice (che è nella definizione), sarà sostituito ogni volta in un posto specificato nel programma. Quindi, invece di fare una funzione e chiamarla, si copia questa funzione all'interno del codice molte volte, come un pezzo di codice.

E se fatereturn da una macro, èreturn da tutto il codice in cui questa macro è inserita.

 
Taras Slobodyanik:

La sostituzione di macro significa che tutto il codice (che è nella definizione), sarà sostituito ogni volta nel posto specificato del programma. Infatti, invece di fare una funzione e chiamarla, si copia questa funzione all'interno del codice molte volte, come un pezzo di codice.

E se fatereturn da una macro, questo è return da tutto il codice dove questa macro è inserita.

Si scopre che non si può scrivere una funzione macro.

 
Seric29:

Si scopre che non c'è modo di scrivere una funzione macro.

Una sostituzione di macro è la sostituzione di un testo con un altro (nel codice sorgente), non può essere una funzione per definizione.

 
Scrivi la tua opinione su questohttps://www.mql5.com/ru/forum/160683/page945#comment_12958065(numero 9448)
 

Come scrivere 2 macro senza saltare a una nuova linea aumenta notevolmente il numero di linee, il che allunga notevolmente il programma, ecco un esempio

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

La macro B non funziona più.

 

è possibile convertire un nome di variabile in una stringa?

Non funziona così:

#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:
Ragazzi, voglio scrivere una macro di makros(a) e funzionerà così: se a è uguale a 1, restituirà qualsiasi valore di tipo int, se a è uguale a 2, restituirà qualsiasi valore di tipo double, se a è uguale a 3, restituirà qualsiasi valore di tipo bool. È possibile farlo?

Per quale motivo? Per quale motivo? Dove lo userete?

 
Igor Makanu:

è possibile convertire un nome di variabile in una stringa?

#define  p_func(NAME)  Print("This is " + #NAME)
 
Seric29:
Ragazzi questa domanda voglio scrivere una macro makros(a), funzionerà così: se a è uguale a 1ce allora la macro restituirà qualsiasi valore di tipo int, se a è uguale a 2ke allora la macro restituirà qualsiasi valore di tipo double, se a è uguale a 3ke allora la macro restituirà qualsiasi valore di tipo bool. È possibile farlo?
#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));
}

In µl, si può fare a meno di GET_EXPAND, ma è roba specifica per µl, è più corretto. Beh, le macro di μl sono molto limitate a causa della mancanza dell'operatore virgola (anche se tramite stampelle...).

ZZY: ed è tutto a tempo di compilazione, ovviamente.

ZZZY: a proposito, se ci fosse un operatore fantasma, si potrebbe fare questo:

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