OOP, mql5의 템플릿 및 매크로, 미묘함 및 사용 기술 - 페이지 22

 
fxsaber :

감사하다!

그러나 매크로를 취소하는 방법을 찾지 못했습니다.

코드는 다음과 같습니다.

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

이제 작동하지만 FAST_ 접두사를 사용하여 MACROS_PREFIX를 취소하고 싶지만 connect( string host = "localhost" , int port = 6379 ) 호출은 다음과 같이 됩니다.

 
Igor Makanu :

MACROS_PREFIX 를 취소하고 싶지만 connect( string host = "localhost" , int port = 6379 ) 에 대한 호출이 있었습니다.

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

감사하다!

그러나 매크로를 취소하는 방법을 찾지 못했습니다.

코드는 다음과 같습니다.

이제 작동하지만 FAST_ 접두사를 사용하여 MACROS_PREFIX를 취소하고 싶지만 connect( string host = "localhost" , int port = 6379 ) 호출은 다음과 같이 됩니다.

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

작동하는 것이 이상하지만 작동하지 않습니다.

F_CALL()
 
fxsaber :

작동하는 것이 이상하지만 작동하지 않습니다.

내 매크로에는 두 개의 매개변수가 있고 하나를 전달하므로 컴파일러는

 

감사합니다.. 그런데 아직도 이해를 못했어요.. 지옥같은 과학!!!!

말로는 설명할 수 없어 음악의 언어로 해볼게

다음과 같은 코드는 의도한 대로 작동합니다.

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

하지만 코드 텍스트 자체를 최소화하기 위해 MQL에서 매크로 대체를 만들고 싶으므로 다음이 필요합니다.

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

내 매크로에는 두 개의 매개변수가 있고 하나를 전달하므로 컴파일러는

작동하지 않습니다.

   F_CALL(,)
 
fxsaber :

작동하지 않습니다.

당연히. _로 확장됩니다.
 
Igor Makanu :

감사합니다.. 그런데 아직도 이해를 못했어요.. 지옥같은 과학!!!!

말로는 설명할 수 없어 음악의 언어로 해볼게

다음과 같은 코드는 의도한 대로 작동합니다.

하지만 코드 텍스트 자체를 최소화하기 위해 MQL에서 매크로 대체를 만들고 싶으므로 다음이 필요합니다.

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

하지만!!!

CONNECT 매크로는 #undef USE_FAST를 수행하여 재정의할 수 없습니다.

 

당신이 원하는 것을 할 수 있도록

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


어제 마법 주문 #defaine abracadabra ##_ 의 도움으로 제안된 옵션에 관심이 있습니다.

상향:

블라디미르 시마코프 좋아, 내가 알아내려고 노력할게

상향:

만세! 벌었다! (와 함께)

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


고맙습니다! 모든 것이 계획대로 진행되었습니다!


추신: 이 abracadabra에 매크로 __MQL5__ 및 __MQL4__를 추가하는 방법, 그러나 fast_xxx() 함수가 MQL4 코드에 전혀 나타나지 않도록 - NEVER라는 단어에서