外部和输入之间的区别 - 页 3

 
//+------------------------------------------------------------------+
//|                                                          inc.mqh |
//|                        Copyright 2017, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"

extern int x;

int z(){
   x=122;
   return x;

解释一下。

//+------------------------------------------------------------------+
//|                                                          exp.mq5 |
//|                        Copyright 2017, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"

int x=1;

#include <inc.mqh>

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   Alert(x);
   Alert(z());   
   Alert(x);   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   
  }
//+------------------------------------------------------------------+
 
Dmitry Fedoseev:

鸭子,你有一个图书馆。当然,会有不同的变数。所谓的意思是通过include连接mqh。

在C++中,externs只是在include库中描述,否则编译器不会让你编译该项目


Dmitry Fedoseev:

外来的。

当你编译时,includer将被插入到程序的主体中。如果你想在那里描述一个实例,也会发生同样的事情。


或者,你可以用修饰语描述一个外部类或结构;)

 
Igor Makanu:

在C++中,externs要在include库中描述,否则编译器不会让你编译该项目。

调用一个库的通常方法是使用 "#include "作为文件的名称

 
Igor Makanu:

...

这样做的意义在于,在编译时,includer将被插入到程序的主体中,如果你想在那里描述一个实例,也会发生同样的事情。

重点是允许可链接文件独立于整个项目 进行处理,单独编译,从而检查错误。

 
Dmitry Fedoseev:

重点是能够独立于整个项目来处理一个插件文件,将其单独编译,从而检查错误。

我认为我们正在寻找它不存在的那一点。

保留extern是为了与之前写的成千上万的代码兼容,帮助是由一个人写的,他从wiki上复制了一些信息。

 
Igor Makanu:

我认为我们在寻找不存在的意义。

我认为,保留extern是为了兼容以前写的成千上万的代码,而帮助是由一个人从wiki上复制了一些信息而写的。

判决结果如何,先生们?)如果我用.mqh(#include)写一个.mq5程序,我可以安全地写extern,而不用担心意外的后果(就像我在mql4中做的那样),或者使用输入?
 
Maksim Neimerik:
那么先生们的判决是什么呢?)如果我用.mqh(#include)写一个.mq5程序,我可以安全地写extern,而不用担心意外的后果(就像我在mql4中做的那样),或者使用输入?

这取决于什么目的。他们有不同的目的。

 
Maksim Neimerik:
那么,先生们)的判决是什么?如果我用.mqh(#include)写一个.mq5程序,我可以安全地写extern,而不用担心意外的后果(就像我在mql4中做的那样),或者我还是应该使用输入?

使用标准的MQL程序结构:所有的输入都在代码的开头,然后是所有的包含。 例子是这样写的,codobase中99%的代码也是这样写的,你不会得到任何意外。

再次关于extern - 它们可以在程序执行 过程中被改变,但在我看来这是不好的做法,通常所有的外部变量在OnInit()中被复制到它们的变量中,然后与它们一起工作(作为一个专家的例子,为4字符和5字符工作 - 这种设计的例子在网络吨)


而底线是--不要使用extern,如果你修改了旧的代码,用输入法代替,如果extern中有记录,编译器会帮助你发出警告--你必须修复它。

 

顺便说一下,我发现编译器并不关心我可以把枚举的内容重新声明为一个变量

enum mode5
{
   Manual         = 0,// Standard in Pips
   Kijun_sen      = 1 // Stoploss +/- Kijun-sen
};

//а потом где угодно можно объявить и компилятору будет пофиг

string Kijun_sen ="Да мне вообще пофиг что ты там объявил";      
 
Aleksey Semenov:

顺便说一下,我发现编译器并不关心我可以把枚举的内容重新声明为一个变量

如果我声明一个枚举 变量怎么办?

enum mode5
{
   Manual         = 0,// Standard in Pips
   Kijun_sen      = 1 // Stoploss +/- Kijun-sen
};


string Kijun_sen ="Да мне вообще пофиг что ты там объявил"; 

void OnStart()
  {
      mode5 x = Kijun_sen;
   
  }
//+------------------------------------------------------------------+

隐式枚举转换 tst1.mq5 24 17


你也可以检查EnumToString()。


我认为没有声明变量的类型在编译时被简单地抛出,因为没有使用。