程序库: Price_Compare - 页 4

 
Koldun Zloy:

这么说吧。宏的作用到底是什么?

void OnTick() // 框架。
{
  Print("Hello World!");
  
  ::OnTick2();
}

#define OnTick OnTick2

void OnTick() {} // Original.
[删除]  

这完全是在回避问题。在函数中插入必要的代码并不难。

你实际上是在向库用户隐瞒,函数中添加了一些代码。

如果你不得不在别人的程序中使用这种技巧,你一定会诅咒作者。


下面是一个在库中不正确使用宏的例子:

#define  CHECK_INIT_SYNC if (INIT_SYNC::Check()) return

void OnTimer( void )
{
  CHECK_INIT_SYNC;

  ::OldOnTimer();
}

这个宏隐藏了这个地方可能有一个函数出口。

你为什么需要它呢?就为了节省几分钱的字母?这并不严肃。


您可以使用宏来进行条件编译和类型声明(目前还没有普通的类型定义)。

有时你还必须使用宏来声明常量。

在所有其他情况下,宏只会混淆代码。

下面是一个生动的混乱例子:https://www.mql5.com/ru/forum/170952/page50#comment_5488178.

Особенности языка mql5, тонкости и приёмы работы
Особенности языка mql5, тонкости и приёмы работы
  • 2017.07.20
  • www.mql5.com
В данной теме будут обсуждаться недокументированные приёмы работы с языком mql5, примеры решения тех, или иных задач...
 
Koldun Zloy:

这完全是在回避问题。在函数中插入必要的代码并不难。

你实际上是在向库用户隐瞒函数中添加了一些代码。

如果你不得不在别人的程序中处理这种技巧,你会诅咒作者。

问题在于这种解决方案的便利性和需求。在这种情况下,只需一行代码就可以赋予或删除指标的同步特性。也许是您觉得不方便。

这里有一个在您的程序库中不正确使用宏的例子:

这个宏在这里隐藏了函数的退出。

你为什么需要它?就为了节省几分钱的字母?这可不严肃。

这样断章取义可不好。每个 On 函数中都会使用宏。

在条件编译和类型声明(目前还没有正常的类型定义)中允许使用宏。

有时也需要使用宏来声明常量。

在所有其他情况下,宏只会混淆代码。

下面就是一个生动的混乱例子:https://www.mql5.com/ru/forum/170952/page50#comment_5488178。

这个有什么问题?

#define Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)


如果我们需要替换 OrdersTotal() 呢?

[删除]  

这样断章取义是不好的。每个 "On "函数中都会用到这个宏。

我见过所有的函数。它在所有这些函数中都没有任何作用。

这个宏有什么问题吗?

#define Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

除了混淆视听,它什么也做不了。

如果我们需要替换OrdersTotal() 呢?


您不需要替换OrdersTotal()。

 
Koldun Zloy:

我都见过。在所有这些功能中,它都没有做任何有用的事情。

除了混淆视听,它也一无是处。

您不需要替换OrdersTotal()。

我听到了。我不知道其他人使用发布的库有多方便,也不知道有多少人是他们的用户。

所以我不会替别人说话。也许,有一天我会对宏采取不同的态度。现在我不能同意你的观点。