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

 
Taras Slobodyanik :

Makrolar değer döndürür mü?

Peki burada bir örnek kod

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

Peki burada bir örnek kod

makro değiştirme - bu, tüm bu kodun (tanımlanan) her seferinde programın belirtilen yerinde değiştirileceği anlamına gelir. Yani aslında - bir fonksiyon yapıp onu çağırmak yerine, bu fonksiyonu bir kod parçası gibi birçok kez kodun içine kopyalarsınız.

Ve bir makrodan dönüş yaparsanız, bu, bu makronun eklendiği tüm kodlardan bir dönüş olur.

 
Taras Slobodyanik :

makro değiştirme - bu, tüm bu kodun (tanımlanan) her seferinde programın belirtilen yerinde değiştirileceği anlamına gelir. Yani aslında - bir fonksiyon yapıp onu çağırmak yerine, bu fonksiyonu bir kod parçası gibi birçok kez kodun içine kopyalarsınız.

Ve bir makrodan dönüş yaparsanız, bu, bu makronun eklendiği tüm kodlardan bir dönüş olur.

Bir makro işlevi yazmanın mümkün olmadığı ortaya çıktı.

 
Seric29 :

Bir makro işlevi yazmanın mümkün olmadığı ortaya çıktı.

makro değiştirme, bir metnin başka bir metinle değiştirilmesidir (kaynak kodunda), tanım gereği bir işlev olamaz.

 
Bu konudaki görüşlerinizi yazın https://www.mql5.com/ru/forum/160683/page945#comment_12958065 (numara 9448)
 

Yeni bir satıra geçmeden 2 makro nasıl yazılır, bu satır sayısını büyük ölçüde artırır, bu da programı büyük ölçüde uzatır, işte bir örnek

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

Makro B artık çalışmıyor.

 

değişken adını bir dizgeye dönüştürmek mümkün mü?

şu şekilde çalışmıyor:

 #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 :
Arkadaşlar ben bir makro makrosu (a) yazmak istiyorum, şöyle çalışacak: a 1'e eşitse makro int türünden herhangi bir değer döndürür, a 2'ye eşitse makro geri döner a, 3'e eşitse , double türündeki herhangi bir değer, o zaman makro herhangi bir bool değeri döndürür. Bunu yapabilmek mümkün mü?

Ne için? Ne için? Onu nerede kullanacaksın?

 
Igor Makanu :

değişken adını bir dizgeye dönüştürmek mümkün mü?

 #define p_func(NAME)   Print ( "This is " + #NAME)
 
Seric29 :
Arkadaşlar ben bir makro makrosu (a) yazmak istiyorum, şöyle çalışacak: a 1'e eşitse makro int türünden herhangi bir değer döndürür, a 2'ye eşitse makro geri döner a, 3'e eşitse , double türündeki herhangi bir değer, o zaman makro herhangi bir bool değeri döndürür. Bunu yapabilmek mümkün mü?
 #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 ));
}

µl'de GET_EXPAND olmadan yapabilirsiniz, ancak bu µl'ye özgü çöp veya daha doğrusu öyle. Eh, makrolar, virgül operatörünün olmaması nedeniyle çok sınırlıdır (koltuk değnekleriyle olsa da ...).

Not: Pekala, bunların hepsi elbette derleme zamanı.

ZZY: Bu arada, eğer bir cast operatörü varsa, bunu yapabilirsiniz:

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