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

 
fxsaber:

Ich danke Ihnen!

Aber ich habe nicht herausgefunden, wie ich das Makro überschreiben kann

Hier ist der Code:

#define  MACROS_PREFIX(A) FAST_##A

bool Connect(string host = "localhost", int port = 6379)
   {
   return(MACROS_PREFIX(connect)(host, port));
   }

   
   
bool FAST_connect(string host = "localhost", int port = 6379)
{
return true;
}

bool connect(string host = "localhost", int port = 6379)
{
return true;
}

es funktioniert jetzt, aber mit dem PräfixFAST_ , ich möchteMACROS_PREFIXaußer Kraft setzen, aber so, dassconnect(string host = "localhost",int port = 6379)aufgerufen wurde

 
Igor Makanu:

Ich möchteMACROS_PREFIXaußer Kraft setzen, aberconnect(string host = "localhost", int port = 6379)aufrufen

#undef  MACROS_PREFIX
#define  MACROS_PREFIX(A) A
 
Igor Makanu:

Ich danke Ihnen!

Aber ich habe nicht herausgefunden, wie ich das Makro überschreiben kann

Hier ist der Code:

es funktioniert jetzt, aber mit dem PräfixFAST_ , ich möchteMACROS_PREFIXaußer Kraft setzen, aber so, dassconnect(string host = "localhost", int port = 6379)aufgerufen wurde

#define  F_CALL(dPrefix,dFunc) dPrefix##_##dFunc

void Foo()  {Alert("Null");}
void _Foo() {Foo();}
void SomePref_Foo()  {Alert("SomeFunc");}

void OnStart(){
   F_CALL(,Foo)();
   F_CALL(SomePref,Foo)();
}
 

Es ist seltsam, dass es funktioniert, aber es funktioniert nicht.

F_CALL()
 
fxsaber:

Es ist seltsam, dass es funktioniert, aber es funktioniert nicht.

Mein Makro hat zwei Parameter, aber Sie übergeben nur einen, also flucht der Compiler.

 

Danke... aber ich habe es immer noch nicht herausgefunden.... Wissenschaft aus der Hölle!!!!

Ich kann es nicht in Worten erklären, aber ich werde es in Notensprache versuchen.

Dieser Code funktioniert wie vorgesehen:

bool USE_SAVE_MODE = true;                      // проверка пинга
bool ping() { return(true); }                   // заглушка 
bool connect(string h,int p) { return(true);}   // заглушка 
//+------------------------------------------------------------------+
bool ExPing()
   {
   if(USE_SAVE_MODE)
      {
      Print("safe mode on");
      return(ping());
      }
   else
      {
      Print("safe mode off");
      return(true);
      }

   }
//+------------------------------------------------------------------+
bool Connect(string host = "localhost", int port = 6379)
   {
   return ExPing() && connect(host, port);
   }

//+------------------------------------------------------------------+
void OnStart()
   {
      Connect();
      USE_SAVE_MODE = false; // отключили проверку пинга
      Connect();
   }
//+------------------------------------------------------------------+

Aber ich möchte eine Makro-Substitution in MQL zu machen, um den Code-Text selbst zu minimieren, so muss ich:

#define   USE_FAST                               // тут нужно что-нибудь сделать!
bool connect(string h,int p)      {    }        // код 1
bool fast_connect(string h,int p) {    }        // код 2
//+------------------------------------------------------------------+
bool Connect(string host = "localhost", int port = 6379)
   {
   return connect(host, port);                  // вот тут нужен префикс и будет или connect(host, port);  или fast_connect(host, port); 
   }

//+------------------------------------------------------------------+
void OnStart()
   {
      Connect();
   }
//+------------------------------------------------------------------+
 
Vladimir Simakov:

Mein Makro hat zwei Parameter und Sie übergeben einen, deshalb kämpft der Compiler

Das funktioniert nicht.

   F_CALL(,)
 
fxsaber:

Das funktioniert nicht.

Natürlich tut sie das. Sie lassen es expandieren in _
 
Igor Makanu:

Danke... aber ich habe es immer noch nicht herausgefunden.... Wissenschaft aus der Hölle!!!!

Ich kann es nicht in Worten erklären, aber ich werde es in Notensprache versuchen.

Dieser Code funktioniert wie vorgesehen:

aber ich möchte eine Makro-Substitution in MQL machen, um den Code-Text selbst zu minimieren, so dass ich es brauche:

#define   USE_FAST                               // тут нужно что-нибудь сделать!
#ifdef  USE_FAST
   #define  CONNECT fast_connect
#else
   #define  CONNECT connect
#endif
bool connect(string h,int p)      {    }        // код 1
bool fast_connect(string h,int p) {    }        // код 2
//+------------------------------------------------------------------+
bool Connect(string host = "localhost", int port = 6379)
   {
   return CONNECT(host, port);                  // вот тут нужен префикс и будет или connect(host, port);  или fast_connect(host, port); 
   }
//+------------------------------------------------------------------+
void OnStart()
   {
      Connect(...);
   }
//+------------------------------------------------------------------+

ABER!!!

Das Makro CONNECT kann nicht durch #undef USE_FAST überschrieben werden.

 

damit ich tun kann, was ich will.

#define   USE_FAST
bool connect(string h,int p)      { Print("On");   return true; }
bool fast_connect(string h,int p) { Print("Off");   return true;}
//+------------------------------------------------------------------+
bool Connect(string host = "localhost", int port = 6379)
   {
   #ifdef  USE_FAST
   return connect(host, port);
   #else return fast_connect(host, port);
   #endif 
   }

//+------------------------------------------------------------------+
void OnStart()
   {
      Connect();
   }
//+------------------------------------------------------------------+


interessiert an den gestern vorgeschlagenen Optionen mit dem Zauberspruch #defaine abracadabra ##_

UPD:

Vladimir Simakov OK, ich werde versuchen, es herauszufinden

UPD:

HOORAY! ES HAT GEKLAPPT! (С)

#define   USE_FAST
#ifdef  USE_FAST
   #define  CONNECT fast_connect
#else
   #define  CONNECT connect
#endif

bool connect(string h,int p)      { Print("On");   return true; }
bool fast_connect(string h,int p) { Print("Off");   return true;}
//+------------------------------------------------------------------+
bool Connect(string host = "localhost", int port = 6379)
   {
   return CONNECT(host, port);
   }

//+------------------------------------------------------------------+
void OnStart()
   {
      Connect();
   }
//+------------------------------------------------------------------+


Danke! Es hat geklappt, wie beabsichtigt!


PZY: Wie würde ich __MQL5__- und __MQL4__-Makros zu diesem Abrakadabra hinzufügen, aber fast_xxx()-Funktionen werden niemals in MQL4-Code vorkommen - vom Wort NEVER