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

 
abolk:

а кто сказал, что автор ввёл термины, которые появились с лёкой руки переводчика?

переводчик - это же не автор статьи 

abolk, а вы случаем не юрист копирайтер? :-)

Всё может быть...

Всё же интересно мнение разработчика MQL5.

 

языках с\с++ существуют внутренние связи, внешние связи и отсутствие связей. Глобальные переменные имеют внешние связи и это позволяет получить доступ к ним из любой части программы. Если к глобальным переменным добавить спецификатор static, то глобальные переменные утратят внешние связи и будут иметь только внутренние связи, т.е. будут доступны только внутри файла, в котором они были описаны. Локальные переменные не имеют связей и поэтому доступны только внутри блока где они были описаны.

Пусть автор той статьи попробует получить доступ к переменной Х из любой части программы (в таком примере):

Видимо, у него глобальными считаются только переменные, объявленные во первых строках программы))

X = 1;
int  X;
 
abolk:

вот вы написали, что корректней говорить не "область видимости", а "связь":

 поясните почему так считаете

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

 
denkir:

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

а понятия "внешняя область видимости" и не было никогда.

была и есть просто "область видимости".

для справки из Википедии:

https://ru.wikipedia.org/wiki/%D0%9E%D0%B1%D0%BB%D0%B0%D1%81%D1%82%D1%8C_%D0%B2%D0%B8%D0%B4%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B8 

 
denkir:

Разработчик MQL5 приблизил функционал языка к аналогу С++.

Есть такой вопрос к нему по спецификаторам. Работают ли в MQL5 следующие утверждения?

1) В  С++ существуют внутренние связи, внешние связи и отсутствие связей.

2) Глобальные переменные имеют внешние связи и это позволяет получить доступ к ним из любой части программы.

3) Если к глобальным переменным добавить спецификатор static, то глобальные переменные утратят внешние связи и будут иметь только внутренние связи, т.е. будут доступны только внутри файла, в котором они были описаны.

4) Локальные переменные не имеют связей и поэтому доступны только внутри блока где они были описаны.

Лично у меня по 2-му 4-му пп вопросов нет. А вот по 3-му есть...


1) Не совсем понятно утверждение и речь в нём о C++(не к нам), если имелось в виду MQL5, то да, в MQL5 имеется область видимости для переменных (если я правильно понял).
2) Да, глобальная переменная доступна(видна) из любого места программы.
3) Нет, модификатор static не влияет на видимость глобальной переменной, т.к. EX5 собирается с одного файла mq5
4) Да, локальные переменные доступны(видны) с момента объявления и до конца блока объявления.


 
mql5:

1) Не совсем понятно утверждение и речь в нём о C++(не к нам), если имелось в виду MQL5, то да, в MQL5 имеется область видимости для переменных (если я правильно понял).
2) Да, глобальная переменная доступна(видна) из любого места программы.
3) Нет, модификатор static не влияет на видимость глобальной переменной, т.к. EX5 собирается с одного файла mq5
4) Да, локальные переменные доступны(видны) с момента объявления и до конца блока объявления.


Вот, спасибо за пояснения ! Особенно за пункт №3.
 
Кто о чём, а вшивый - о бане...

Насчёт перевода... вот тут на официальном сайте есть такое:

The extern keyword declares a variable or function and specifies that it has external linkage (its name is visible from files other than the one in which it's defined). When modifying a variable, extern specifies that the variable has static duration (it is allocated when the program begins and deallocated when the program ends). The variable or function may be defined in another source file, or later in the same file. Declarations of variables and functions at file scope are external by default.

Т.е. под связью имелся в виду термин linkage. Скорее нужно употреблять при переводе не понятие "связь", а понятие "связывание". Об этом, как мне кажется, и говорил abolk.

linkage

LingvoComputer (En-Ru)

1) сборка; связывание; компоновка; редактирование связей

- external linkage

- internal linkage

- feature linkage

2) связь || установление связи

3) согласующее устройство; согласующие элементы

Перевожу выдержку так:

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

Using extern to Specify Linkage
Using extern to Specify Linkage
  • msdn.microsoft.com
The keyword declares a variable or function and specifies that it has external linkage (its name is visible from files other than the one in which it's defined). When modifying a variable, specifies that the variable has static duration (it is allocated when the program begins and deallocated when the program ends). The variable or function may...
 

В С++ есть такая штука:

#include <stdio.h>

int main(void)
{
  extern int first, last; /* используются глобальные переменные */

  printf("%d %d", first, last);

  return 0;
}

/* описание глобальных переменных first и last */
int first = 10, last = 20;

Программа напечатает 10 и 20, потому что глобальные переменные first и last инициализированы этими значениями. Объявление extern сообщает компилятору, что переменные first и last определены в другом месте, поэтому программа компилируется без ошибки, несмотря даже на то, что first и last используются до своего описания.

О том, что такая конструкция не работает в MQL5 я и не говорю. Вопрос в другом. Я создал заголовочный файл, где написал строки:

extern int first=10,last=20;

Потом его включаю в код скрипта директивой #include. И  в теле функции OnStart() своего скрипта пишу следующее:

void OnStart()
  {
   extern int first,last; // внешние переменные
  }

Компилятор ругается на 'extern' - unexpected token. А мне принципиально важно, чтобы мои переменные не инициализировались по умолчанию единицей, а получили значение внешних переменных. Естественно, что внутри функции тоже не хочу их сам инициализировать. Задача стоит в другом...

Большая просьба к разработчикам внести подробное описание модификатора extern.

 
denkir:

В С++ есть такая штука:

Программа напечатает 10 и 20, потому что глобальные переменные first и last инициализированы этими значениями. Объявление extern сообщает компилятору, что переменные first и last определены в другом месте, поэтому программа компилируется без ошибки, несмотря даже на то, что first и last используются до своего описания.

О том, что такая конструкция не работает в MQL5 я и не говорю. Вопрос в другом. Я создал заголовочный файл, где написал строки:

Потом его включаю в код скрипта директивой #include. И  в теле функции OnStart() своего скрипта пишу следующее:

Компилятор ругается на 'extern' - unexpected token. А мне принципиально важно, чтобы мои переменные не инициализировались по умолчанию единицей, а получили значение внешних переменных. Естественно, что внутри функции тоже не хочу их сам инициализировать. Задача стоит в другом...

Большая просьба к разработчикам внести подробное описание модификатора extern.

Насколько я разбираюсь в инклудах, Вам совсем необязательно в данном случае специально стараться чтоб увидеть эти переменные в теле основной программы. Директива  #include  действует во время компиляции очень просто: препроцессор удаляет директиву и на её место вставляет полный текст файла указанного в директиве. И всё. Таким образом любые объявления на глобальном уровне в инклудах автоматом становятся равноправными  объявлениями  глобального уровня основной программы. И объявлять их вторично не нужно. Ни с extern'ом ни без.   Модификатор extern вам вообще не нужен. ( в данном конкретном случае )
 
MetaDriver:
...совсем необязательно в данном случае специально стараться чтоб увидеть эти переменные в теле основной программы. Директива  #include  действует во время компиляции очень просто: препроцессор удаляет директиву и на её место вставляет полный текст файла указанного в директиве. И всё. Таким образом любые объявления на глобальном уровне в инклудах автоматом становятся равноправными  объявлениями  глобального уровня основной программы. И объявлять их вторично не нужно. Ни с extern'ом ни без.   Модификатор extern вам вообще не нужен. ( в данном конкретном случае )

Спасибо за разъяснение. Насчёт #include это всё понятно. Ещё понятно, что механизм extern работает в MQL5 не так как в С++. Например, в теле функции extern-переменную не объявить.

Было бы интересно услышать объяснение разработчиков.



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