Разница между extern и input - страница 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:

Дак, у вас же библиотека. Конечно, будет разные переменные. Имеется ввиду подключение mqh через include.

в С++ экстерны как раз и описываются в подключаемых библиотеках, иначе компилятор не даст скомпилировать проект


Dmitry Fedoseev:

Экспет:

и смысл в этом? инклудник при компиляции в тело программы будет вставлен, хотите там инпут опишите - то же самое будет


как вариант опишите с модификатором экстерн класс или структуру ;)

 
Igor Makanu:

в С++ экстерны как раз и описываются в подключаемых библиотеках, иначе компилятор не даст скомпилировать проект

Там наверно принято библиотеками называть файлы подключаемые через "#include" 

 
Igor Makanu:

...

и смысл в этом? инклудник при компиляции в тело программы будет вставлен, хотите там инпут опишите - то же самое будет

Смысл в том, чтобы над подключаемым файлом можно было работать независимо от всего проекта, компилировать его отдельно и тем самым проверять ошибки.

 
Dmitry Fedoseev:

Смысл в том, чтобы над подключаемым файлом можно было работать независимо от всего проекта, компилировать его отдельно и тем самым проверять ошибки.

по моему мы ищем смысл где он просто отсутствует

имхо, extern оставили для совместимости тысяч кодов написанных ранее, а справку писал человек который часть информации скопировал из Вики

 
Igor Makanu:

по моему мы ищем смысл где он просто отсутствует

имхо, extern оставили для совместимости тысяч кодов написанных ранее, а справку писал человек который часть информации скопировал из Вики

Так каков вердикт Господа?) Если я пишу .mq5 программу с .mqh (#include), я могу смело прописывать extern и не бояться неожиданных последствий (как я это делал в mql4) или все же использовать input ?
 
Maksim Neimerik:
Так каков вердикт Господа?) Если я пишу .mq5 программу с .mqh (#include), я могу смело прописывать extern и не бояться неожиданных последствий (как я это делал в mql4) или все же использовать input ?

Смотря для каких целей. У них назначения р а з н ы е.

 
Maksim Neimerik:
Так каков вердикт Господа?) Если я пишу .mq5 программу с .mqh (#include), я могу смело прописывать extern и не бояться неожиданных последствий (как я это делал в mql4) или все же использовать input ?

используйте стандартные конструкции MQL программ: в начале кода все input , затем все include - так написаны и примеры от разработчиков, так написаны и 99% кодов в кодобазе и не будет никаких сюрпризов

про extern еще раз повторю - их можно изменять в ходе выполнения программы, но по моему это плохая практика, обычно все внешние переменные в OnInit() копируются в свои переменные и потом с ними работают (как пример эксперты которые работают под 4-х знак и 5-ти знак - примеров этой конструкции в сети вагон)


ну и итого - не используйте extern, если модифицируете старый код, то замените на input и компилятор Вам поможет предупреждениями если была запись в extern - это нужно исправить 

 

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

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

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

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

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

а если переменную типа enum  обьявить? 

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


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

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

implicit enum conversion tst1.mq5 24 17


можно еще EnumToString() проверить...


думаю что тип без объявленных переменных просто был выброшен из компиляции как не используемый