OOP, mql5'te şablonlar ve makrolar, incelikler ve kullanım teknikleri - sayfa 22

 
fxsaber :

teşekkür etmek!

ama makroyu nasıl iptal edeceğimi bulamadım

işte kod:

 #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 ;
}

şimdi çalışıyor, ancak FAST_ öneki ile MACROS_PREFIX öğesini iptal etmek istiyorum, ancak connect( string host = "localhost" , int port = 6379 ) çağrısı olur

 
Igor Makanu :

MACROS_PREFIX'i iptal etmek istiyorum, ancak bağlanmak için bir çağrı yapıldı ( string host = "localhost" , int port = 6379 )

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

teşekkür etmek!

ama makroyu nasıl iptal edeceğimi bulamadım

işte kod:

şimdi çalışıyor, ancak FAST_ öneki ile MACROS_PREFIX öğesini iptal etmek istiyorum, ancak connect( string host = "localhost" , int port = 6379 ) çağrısı olur

 #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)();
}
 

Çalışması garip ama çalışmıyor.

F_CALL()
 
fxsaber :

Çalışması garip ama çalışmıyor.

Makromda iki parametre var ve birini iletiyorsunuz, bu yüzden derleyici yemin ediyor

 

teşekkürler... ama yine de anlamadım.... cehennem bilimi!!!!

kelimeler burada anlatamaz, müziğin dilinde deneyeceğim

bunun gibi kod amaçlandığı gibi çalışır:

 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();
   }
//+------------------------------------------------------------------+

ancak kod metninin kendisini en aza indirmek için MQL'de bir makro değişikliği yapmak istiyorum, bu yüzden gerekli:

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

Makromda iki parametre var ve birini iletiyorsunuz, bu yüzden derleyici yemin ediyor

Çalışmıyor.

   F_CALL(,)
 
fxsaber :

Çalışmıyor.

Doğal olarak. _ içine genişler
 
Igor Makanu :

teşekkürler... ama yine de anlamadım.... cehennem bilimi!!!!

kelimeler burada anlatamaz, müziğin dilinde deneyeceğim

bunun gibi kod amaçlandığı gibi çalışır:

ancak kod metninin kendisini en aza indirmek için MQL'de bir makro değişikliği yapmak istiyorum, bu yüzden gerekli:

 #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(...);
   }
//+------------------------------------------------------------------+

ANCAK!!!

CONNECT makrosu, #undef USE_FAST yapılarak geçersiz kılınamaz

 

böylece istediğini yapabilirsin

 #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();
   }
//+------------------------------------------------------------------+


sihirli büyünün yardımıyla dün önerilen seçeneklerle ilgileniyor #defaine abracadabra ##_

UPD:

Vladimir Simakov tamam, anlamaya çalışacağım

UPD:

HURRAH! KAZANDI! (İLE)

 #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();
   }
//+------------------------------------------------------------------+


Teşekkür ederim! her şey planlandığı gibi gitti!


Not: Bu abrakadabraya __MQL5__ ve __MQL4__ makroları nasıl eklenir, ancak böylece fast_xxx() işlevleri MQL4 kodunda hiçbir zaman görünmez - ASLA kelimesinden