mql5中的OOP、模板和宏,细微之处和用途 - 页 17

 
Taras Slobodyanik:

宏是否会返回值?

好吧,这里有一个代码例子

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

好吧,这里有一个示例代码

宏替换意味着所有这些代码(在定义中),每次都会在程序中的指定位置被替换掉。因此,事实上,你不是做一个函数并调用它,而是在代码里面多次复制这个函数,作为一段代码。

如果你从一个宏中返回,它就是从所有插入这个宏的代码中返回

 
Taras Slobodyanik:

宏替换意味着所有的代码(在定义中),每次都会被替换到程序的指定位置。事实上,你不是制作一个函数并调用它,而是在代码里面多次复制这个函数,作为一段代码。

如果你从一个宏中返回,这就是从插入这个宏的整个代码中返回

事实证明,你不能写一个宏函数。

 
Seric29:

事实证明,没有办法写一个宏函数。

宏替换是用一个文本替换另一个文本(在源代码中),根据定义它不能是一个函数。

 
请写下你对这个https://www.mql5.com/ru/forum/160683/page945#comment_12958065(编号9448)的看法。
 

如何在不跳转到新行 的情况下编写2个宏,它大大增加了行数,大大延长了程序的长度,下面是一个例子

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

巨集B不再起作用了。

 

是否可以将变量名转换为字符串?

它不是那样工作的。

#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:
伙计们,我想写一个makros(a)的宏,它将这样工作:如果a等于1,它将返回任何int类型的值,如果a等于2,它将返回任何double类型 的值,如果a等于3,它将返回任何bool类型的值。有可能做到这一点吗?

为了什么?为了什么?你打算在哪里使用它?

 
Igor Makanu:

是否可以将变量名转换为字符串?

#define  p_func(NAME)  Print("This is " + #NAME)
 
Seric29:
伙计们,我想写一个宏makros(a),它的工作原理是:如果a等于1ce,那么该宏将返回int类型的任何值;如果a等于2ke,那么该宏将返回double类型 的任何值;如果a等于3ke,那么该宏将返回bool类型的任何值。有可能做到这一点吗?
#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中,你可以不用GET_EXPAND,但这是μl特有的东西,它更正确。好吧,由于缺乏逗号运算符,μl宏非常有限(虽然通过拐杖......)。

ZZY:当然,这都是在编译时进行的。

ZZZY:顺便说一下,如果有一个幽灵操作员,你可以这样做。

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