OOP, Vorlagen und Makros in mql5, Feinheiten und Anwendungen - Seite 17

 
Taras Slobodyanik:

Geben Makros Werte zurück?

Hier ist ein Beispiel für einen Code

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

Hier ist ein Codebeispiel

Makro-Substitution bedeutet, dass der gesamte Code (der sich im Define befindet) jedes Mal an einer bestimmten Stelle im Programm ersetzt wird. Anstatt also eine Funktion zu erstellen und sie aufzurufen, kopieren Sie diese Funktion innerhalb des Codes viele Male, als ein Stück Code.

Und wenn Sie aus einem Makrozurückkehren, wird es aus dem gesamten Codezurückkehren, in dem dieses Makro eingefügt ist.

 
Taras Slobodyanik:

Makro-Substitution bedeutet, dass der gesamte Code (der im Define steht) jedes Mal an der angegebenen Stelle des Programms ersetzt wird. Anstatt eine Funktion zu erstellen und sie aufzurufen, kopieren Sie diese Funktion mehrmals in den Code, als ein Stück Code.

Und wenn Sie aus einem Makrozurückkehren, ist dies eine Rückkehr aus dem gesamten Code, in den dieses Makro eingefügt ist.

Es stellt sich heraus, dass Sie keine Makrofunktion schreiben können.

 
Seric29:

Es stellt sich heraus, dass es keine Möglichkeit gibt, eine Makrofunktion zu schreiben.

Eine Makro-Substitution ist das Ersetzen eines Textes durch einen anderen (im Quellcode), sie kann per Definition keine Funktion sein.

 
Schreiben Sie Ihre Meinung zu diesemhttps://www.mql5.com/ru/forum/160683/page945#comment_12958065(Nummer 9448)
 

Wenn man 2 Makros schreibt, ohne in eine neue Zeile zu springen, erhöht sich die Anzahl der Zeilen stark, was das Programm erheblich verlängert, hier ein Beispiel

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

Makro B funktioniert nicht mehr.

 

Ist es möglich, einen Variablennamen in eine Zeichenkette umzuwandeln?

So funktioniert das nicht:

#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:
Leute, ich möchte ein Makro von makros(a) schreiben und es wird wie folgt funktionieren: wenn a gleich 1 ist, wird es einen beliebigen Wert vom Typ int zurückgeben, wenn a gleich 2 ist, wird es einen beliebigen Wert vom Typ double zurückgeben, wenn a gleich 3 ist, wird es einen beliebigen Wert vom Typ bool zurückgeben. Ist es möglich, dies zu tun?

Und wozu? Und wozu? Wo werden Sie es einsetzen?

 
Igor Makanu:

Ist es möglich, einen Variablennamen in eine Zeichenkette umzuwandeln?

#define  p_func(NAME)  Print("This is " + #NAME)
[Gelöscht]  
Seric29:
Ich möchte ein Makro makros(a) schreiben, das wie folgt funktioniert: wenn a gleich 1ce ist, gibt das Makro einen beliebigen Wert vom Typ int zurück, wenn a gleich 2ke ist, gibt das Makro einen beliebigen Wert vom Typ double zurück, wenn a gleich 3ke ist, gibt das Makro einen beliebigen Wert vom Typ bool zurück. Ist es möglich, dies zu tun?
#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 kann man auf GET_EXPAND verzichten, aber das ist µl-spezifisch und daher korrekter. Nun, μl Makros sind sehr begrenzt aufgrund des Fehlens von Komma-Operator (obwohl durch Krücken ...).

ZZY: und das ist natürlich alles Kompilierzeit.

ZZZY: Übrigens, wenn es einen Ghost Operator gäbe, könnte man das machen:

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