Спецификаторы доступа - страница 3

 

Вот беру из Документации:

Ключевое слово extern используется, чтобы объявить идентификаторы переменных как идентификаторы статического класса памяти с глобальным временем жизни. Такие переменные существуют с момента начала выполнения программы и для них память выделяется и инициализируется сразу после начала выполнения программы.

А что, разве идентификаторы обычных глобальных переменных не принадлежат к статическому классу памяти? И разве их время жизни не глобально?
 
denkir:

Вот беру из Документации:

А что, разве идентификаторы обычных глобальных переменных не принадлежат к статическому классу памяти? И разве их время жизни не глобально?

Если вы повторно объявите например exter int v  во всех своих include модулях, то ошибки не будет. Если же без extern, то компилятор ругнется на дубликат. 

то есть как и написано имеем глобальный static.

но вот к сожалению делать объявление extern в функциях недопустимо. так как принцип extern работает не во время выполнения программы, а на этапе компиляции

 

sergeev:

но вот к сожалению делать объявление extern в функциях недопустимо. так как принцип extern работает не во время выполнения программы, а на этапе компиляции

Да вообще-то сделать можно.  В функциях переменные объявленные с модификатором static тоже помещаются в статическую память и это тоже обрабатывается во время компиляции.  Я вот смысл затеи не очень понимаю. 

denkir: , вам это зачем?  Вам принципиально, чтоб инициализация была ниже по коду?

вот компилирую:

int Func()
  {
    static int aa=bb;
    return aa;
  }
int bb=5;
всё работает, полёт нормальный.  Зачем вообще вам extern ?  Из принципа?
 
MetaDriver:

Да вообще-то сделать можно.  В функциях переменные объявленные с модификатором static тоже помещаются в статическую память и это тоже обрабатывается во время компиляции.  Я вот смысл затеи не очень понимаю. 


нельзя.  если ты объявишь эту же переменную в другом модуле, то будет ошибка - variable already defined

а extern проходит через все модули и будет общей для всех модулей.

 
sergeev:

нельзя.  если ты объявишь эту же переменную в другом модуле, то будет ошибка - variable already defined

а extern проходит через все модули и будет общей для всех модулей.

Я не о том.  Посмотри код.  Ему надо, чтоб переменная инициализировалась внутри функции. Я так понял. Так она и так может быть проинициализирована, даже если глoбальная переменная,  значением которой она инициализируется, находится ниже по коду.  А про дубликаты я тебе верю. :)
 
denkir: , вам это зачем?  Вам принципиально, чтоб инициализация была ниже по коду?
Зачем вообще вам extern ?  Из принципа?

Хочу разобраться с этим механизмом... ранее не применял его в своём коде...
 
MetaDriver:
Я не о том.  Посмотри код.  Ему надо, чтоб переменная инициализировалась внутри функции. Я так понял. Так она и так может быть проинициализирована, даже если глoбальная переменная,  значением которой она инициализируется, находится ниже по коду...

Так точно!

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

Документация по MQL5: Основы языка / Переменные / Глобальные переменные
Документация по MQL5: Основы языка / Переменные / Глобальные переменные
  • www.mql5.com
Основы языка / Переменные / Глобальные переменные - Документация по MQL5
 

Разрабы будут комментировать, или междусобойчик так и затихнет?


-------------------------/""""\™---------------------------|
|------------------------/*\/*\---------------------------|
|------------------------\/""\/---------------------------|
|-------------------------|\,,/|----------------------------|
|------------------------/^<>^\---------------------------|
|---------------------"\/""\\//""\/"\-----------------------|
|-------------------/```\```\/```/``\----------------------|
|-------------------\\``/``\()/``\``//----------------------|
|-------------------/``/\___/\___/\``\----------------------|
|-------------------\^`\/``[][]``\/`^/----------------------|
|------[][][]-------/```\``[][]``/```\---------[][][]--------|
|----[][][][]-------\\``/\`[][]`/\``//----------[][][][]------|
|----[][][][]--------\\/`|[=()=]|`\//-----------[][][][]------|
|-=[][][][][]====/|\=======/|\======[][][][][]=---|
|----[][][][]--------"""-////\\\\-"""-------------[][][][]------|
|----[][][][]----------/||||--|||\----------------[][][][]------|
|------[][][]----------|||||--|||||---------------[][][]--------|
|----------------------\||||--|||/--------------------------|
|-----------------------||||--||||--------------------------|
|-----------------------|||\--/|||--------------------------|
|-----------------------\||/--\||/--------------------------|
|-----------------------/||----||\--------------------------|
|---------------------[]__|---|___l-----------------------|

 
Глобальная переменная в MQL5, в пределах одного mq5 файла со всеми его #include будет видна в любой функции.

Описание extern в справке.

Попытаюсь объяснить по другому. Для работы функций, которые размещены в #include файлах могут потребоваться глобальные переменные, но если их просто объявить внутри *.mqh, то при компиляции может возникнуть ошибка, когда одна и та же глобальная переменная используется в нескольких *.mqh, вот тут и приходит на помощь extern. Все объявления одной глобальной переменной (с одним именем и типом) с модификатором extern "сольются" в одно объявление - компилятор объединит все объявления в одно.
 
mql5:
Глобальная переменная в MQL5, в пределах одного mq5 файла со всеми его #include будет видна в любой функции.

Это понятно.

...Попытаюсь объяснить по другому. Для работы функций, которые размещены в #include файлах могут потребоваться глобальные переменные, но если их просто объявить внутри *.mqh, то при компиляции может возникнуть ошибка, когда одна и та же глобальная переменная используется в нескольких *.mqh, вот тут и приходит на помощь extern. Все объявления одной глобальной переменной (с одним именем и типом) с модификатором extern "сольются" в одно объявление - компилятор объединит все объявления в одно.

А вот за это разъяснение большое спасибо. По-моему, оно существенно дополняет справку. Имхо, неплохо было его туда добавить. Ну и примеры приложить...

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