OOP, templates et macros dans mql5, subtilités et utilisations - page 17

 
Taras Slobodyanik:

Les macros renvoient-elles des valeurs ?

Voici un exemple de 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:

Voici un exemple de code

La substitution de macro signifie que tout ce code (qui se trouve dans la définition), sera substitué à chaque fois à un endroit précis du programme. Donc en fait, au lieu de créer une fonction et de l'appeler, vous copiez cette fonction à l'intérieur du code plusieurs fois, comme un morceau de code.

Et si vous faites unretour à partir d'une macro, c'est unretour à partir de tout le code où cette macro est insérée.

 
Taras Slobodyanik:

La substitution de macro signifie que tout le code (qui se trouve dans la définition), sera substitué à chaque fois à l'endroit spécifié du programme. En fait, au lieu de créer une fonction et de l'appeler, vous copiez cette fonction plusieurs fois dans le code, comme un morceau de code.

Et si vous faites leretour d'une macro, c'est le retour de tout le code où cette macro est insérée.

Il s'avère que vous ne pouvez pas écrire une fonction macro.

 
Seric29:

Il s'avère qu'il n'existe aucun moyen d'écrire une fonction macro.

Une macro-substitution consiste à remplacer un texte par un autre (dans le code source), il ne peut s'agir d'une fonction par définition.

 
Écrivez votre opinion sur cesite https://www.mql5.com/ru/forum/160683/page945#comment_12958065(numéro 9448)
 

Comment écrire 2 macros sans sauter à une nouvelle ligne cela augmente considérablement le nombre de lignes, ce qui allonge considérablement le programme, voici un exemple

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

La macro B ne fonctionne plus.

 

est-il possible de convertir un nom de variable en une chaîne de caractères ?

Ça ne marche pas comme ça :

#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:
Les gars, je veux écrire une macro de makros(a) et elle fonctionnera comme suit : si a est égal à 1, elle retournera toute valeur de type int, si a est égal à 2, elle retournera toute valeur de type double, si a est égal à 3, elle retournera toute valeur de type bool. Est-il possible de le faire ?

Pour quoi faire ? Pour quoi faire ? Où allez-vous l'utiliser ?

 
Igor Makanu:

est-il possible de convertir un nom de variable en une chaîne de caractères ?

#define  p_func(NAME)  Print("This is " + #NAME)
 
Seric29:
Guys cette question je veux écrire une macro makros(a), elle fonctionnera comme suit : si a est égal à 1ce alors la macro retournera toute valeur de type int, si a est égal à 2ke alors la macro retournera toute valeur de type double, si a est égal à 3ke alors la macro retournera toute valeur de type bool. Est-il possible de le faire ?
#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));
}

Dans µl, vous pouvez vous passer de GET_EXPAND, mais c'est un truc spécifique à µl, c'est plus correct. Eh bien, les macros μl sont très limitées en raison de l'absence d'opérateur de virgule (bien que par des béquilles...).

ZZY : et c'est tout le temps de la compilation, bien sûr.

ZZZY : au fait, s'il y avait un opérateur fantôme, tu pourrais faire ça :

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