Разница между extern и input - страница 5

 
Alexey Navoykov:

 Представьте, что эти инициализации выполнены в разных подключаемых файлах. Тогда итоговый результат будет зависеть от порядка включений этих файлов.

ну вот - даже такие явные баги с этими extern

  вот я и пишу, что смысла в них нет, они только для совместимости со старыми кодами - увидел extern замени на input и исправь ошибки... а то в справке написано... туманное предназначение.... нет смысла в extern - как не ищи

 
Alexey Navoykov:

Реализация extern-переменных в MQL5 к сожалению не доработана, а потому применять её не советую, чревато проблемами.  Речь идёт об отсутствии контроля за обязательной однократностью инициализации этих переменных.

Например, можно написать так:

и ошибки не будет.  Представьте, что эти инициализации выполнены в разных подключаемых файлах. Тогда итоговый результат будет зависеть от порядка включений этих файлов.

Или так (исполняемый файл):

здесь мы вообще не проинициализировали extern-переменную, но ошибки тоже нет.

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

В общем, такое никуда не годится. Поэтому вместо extern-переменных лучше использовать функции.  У них гарантируется только одно определение, не больше и не меньше.

При таком подходе и компьютером вообще пользоваться не стоит. Потому что, если закрыть глаза, потыкать по клаве - получится фигня.

А настоящая проблем в extern возникает когда пытаешься сделать extern из input. Деталей не помню, давно было. В итоге, вообще отказался от extern, объявил во включаемом файле простую переменную, а в ините советника устанавливал ей значение через вызов функции.

 
Igor Makanu:

ну вот - даже такие явные баги с этими extern

  вот я и пишу, что смысла в них нет, они только для совместимости со старыми кодами - увидел extern замени на input и исправь ошибки... а то в справке написано... туманное предназначение.... нет смысла в extern - как не ищи

Есть смысл. В МТ5 во включаемых файлах extern это совсем не input.

 
Dmitry Fedoseev:

Есть смысл. В МТ5 во включаемых файлах extern это совсем не input.

зачем во включаемых файлах добавлять inputы ?

не знаю, что там творится в современном мире написания программ, но учился я писать в процедурном стиле, затем начал использовать ООП, что в первом, что во втором стиле подразумевается, что каждый логический блок должен быть полностью функционален при переносе в другую программу, т.е. написали функцию - у нее в в описании (в заголовке) есть все параметры которые она использует - ей inputы не нужны - вырезали эту функцию и вставили в другой файл, она "переехала" как есть - также и с классами. 

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


А использование extern в подключаемом файле, имхо способ получить трудноотслеживаемый баг, @Alexey Navoykov выше показал как это бывает, к сожалению более половины имен переменных у всех программистов имеют до буквы одинаковые имена, максимум отличие в использовании заглавных/строчных букв, как пример MagicNumber или Magic - если посмотреть КБ, то через один будут такие переменные, так и в Вашем способе есть угроза "затенить" extern на свою переменную, благо сейчас мало кто использует  externы

 
Igor Makanu:

зачем во включаемых файлах добавлять inputы ?

не знаю, что там творится в современном мире написания программ, но учился я писать в процедурном стиле, затем начал использовать ООП, что в первом, что во втором стиле подразумевается, что каждый логический блок должен быть полностью функционален при переносе в другую программу, т.е. написали функцию - у нее в в описании (в заголовке) есть все параметры которые она использует - ей inputы не нужны - вырезали эту функцию и вставили в другой файл, она "переехала" как есть - также и с классами. 

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

Не так. Во включаемые файлы добавлять extern'ы. Для того, что бы во включаемом файле можно было пользоваться input'ами, объявленными в главном файле.

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

 
Dmitry Fedoseev:

Не так. Во включаемые файлы добавлять extern'ы. Для того, что бы во включаемом файле можно было пользоваться input'ами, объявленными в главном файле.

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

пример дайте целесообразности использования  extern

 
Igor Makanu:

пример дайте целесообразности использования  extern

Уже давно здесь

 
Dmitry Fedoseev:

При таком подходе и компьютером вообще пользоваться не стоит. Потому что, если закрыть глаза, потыкать по клаве - получится фигня.

Фигня то конечно получится, только вот компилироваться такое вряд ли будет. Задача компилятора и состоит в том, чтобы не компилировать фигню. А в рассматриваемом случае он с этой задачей не справляется.
 
Dmitry Fedoseev:

Уже давно здесь

ну вот я про это и говорил

Ваш пример это порождение скрытых багов, имя переменной х - часто используют.... выше писал

имхо это должно было так выглядеть:

extern int x;

int z()
  {
   static int x;
   x=122;
   return x;
  }
 
Igor Makanu:

ну вот я про это и говорил

Ваш пример это порождение скрытых багов, имя переменной х - часто используют.... выше писал

имхо это должно было так выглядеть:

Не пойдет. Переменная x должна быть доступна не только в одной функции, а во всех. И даже больше - она должна быть доступна как в главном файле, так и во всех подключенных файлах.

Причина обращения: