mql5语言的特点、微妙之处以及技巧 - 页 216

 
Igor Makanu #:

ZS: 我还见过这样的宏,如

我不明白。

 
fxsaber #:

我不明白。

网上有很多关于这种宏的便利性的信息,谷歌 "宏而0"。

https://russianblogs.com/article/9410298326/

 

很久以前,在这个主题中就有一个while(0)的例子

https://www.mql5.com/ru/forum/170952/page141#comment_12897922

Особенности языка mql5, тонкости и приёмы работы
Особенности языка mql5, тонкости и приёмы работы
  • 2019.07.30
  • www.mql5.com
В данной теме будут обсуждаться недокументированные приёмы работы с языком mql5, примеры решения тех, или иных задач...
 
mktr8591 #:
为了明确这一点,它只针对静态的(这都是关于C++的)。对于局部变量,如果有一个用户c-tor,就不会有nulling。

我喜欢这个解释本身,它与OOP没有任何抵触。

当你创建一个简单的结构对象时,会发生以下情况。

  1. 内存被分配给该结构 - 任何垃圾都在那里。
  2. 构造函数在这块上启动。

当声明经过{}时,在第1-2项之间插入另一个声明--用零填充分配的内存。


在这种逻辑下,OOP并没有受到任何影响。这是一个有效的机制。

 
fxsaber #:

    当{}被声明时,另一个被插入1-2点之间--用零填充分配的内存。

    在这种逻辑下,OOP并没有受到任何影响。有效机制。

    这里的逻辑受到影响:如果反正会有一个构造函数,我们为什么要把它归零呢?

     
    A100 #:

    逻辑本身在这里受到了影响:如果事后会有一个构造函数,为什么还要清零?

    因为带有构造函数的结构不能用于联盟中。

     
    Ilyas #:

    对于union来说,只初始化第一个成员,交换字段,测试就会运行。
    让我们想一想,是否值得改变行为以成为大多数用户所期望的。

    考虑到我已经改变了--现在我检查第一项的x[i].i == 0(之前的条件是x[i].x == 0.0)。

    union X {
        int i;
        double x;
    };
    void OnStart()
    {
        X x[10000] = {}; //(*)
        bool b = true;
        for ( int i = 0; i < ArraySize(x) && (b = (x[i].i == 0)); i++ );
        Print( b );
    }

    结果:假

    而用零内存--真

     
    Igor Makanu #:

    网上有很多关于这种宏的便利性的信息,谷歌 "宏而0"。

    https://russianblogs.com/article/9410298326/

    所有这些乱七八糟的东西只是为了在宏的结尾处放一个分号。我在任何地方都使用大括号,没有任何问题。

     
    A100 #:

    考虑到我已经改变了--现在我检查第一项的x[i].i == 0(以前的条件是x[i].x == 0.0)。

    结果:假

    而有了ZeroMemory--真的。

    是的,mql错误

    (在C++中它返回真)。

     
    我现在(b3110)如何在复杂的结构中归零?
    struct MqlTick2 : private MqlTick
    {
    //  string Str; // С этой строкой не обнулить.
    };
    
    
    template <typename T>
    void ZeroMemoryStruct( T &Struct )
    {
      uchar Bytes[sizeof(T)];
      
      ::CharArrayToStruct(Struct, Bytes);
    }
    
    void OnStart()
    {
      MqlTick2 Tick;
    
      ZeroMemoryStruct(Tick);  
    }