Вопрос к разработчикам. Код компелится! А должен?

 

На скорость не влияет. Но решил на всякий пожарный обратить ваше внимание.

Объявляем одни и теже переменные не глобальном уровне и внутри старта и компелим без ошибок:

   double d;
   int i;
   bool b;
////////////
void start() 
{
   double d;
   int i;
   bool b;

   return;
}

0 ошибок, 0 предупреждений ?

 
старт такая же функция как и остальные, да обьявите любой функции одинаковые переменные они за ней ( внешне) видны не будут
 

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

Ну, должен - так должен.

P.S. Хотя мне как-то трудно с этим смириться.

 
VBAG писал(а) >>

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

Ну, должен - так должен.

P.S. Хотя мне как-то трудно с этим смириться.

ну что ж, бывает....

 
xrust писал(а) >>

Ни первого, ни второго комментария я так и не понял!

Ну ничего..., ну ладно. Все равно благодарю за участие.

 
VBAG писал(а) >>

Ни первого, ни второго комментария я так и не понял!

Ну ничего..., ну ладно. Все равно благодарю за участие.

функция - есть самостоятельная единица, снаружи видится как черный ящик, так? все переменные внутри функции не видны другим, но функция может использовать глобальные переменные.

старт - это тоже функция просто стандартная.... вот и все

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

 
VBAG >>:

Ни первого, ни второго комментария я так и не понял!

Ну ничего..., ну ладно. Все равно благодарю за участие.

Локальные переменные, объявленные внутри функции, перекрывают глобальные переменные, которые объявлены вне функции. Если переменная не найдена среди локальных функций, то она ищется на глобальном уровне.

 
VBAG писал(а) >>

Ни первого, ни второго комментария я так и не понял!

Ну ничего..., ну ладно. Все равно благодарю за участие.

Глобальные переменные видны всей программе. Но если в какой-то функции объявлены переменные с такими же иненами, то они "заслоняют" глобальные и используются как обычные локальные переменные, т.е. в пределах функции не влияя никак на глобальные.

Вот пример(скрипт), посмотрите:

int a=1,b=2;
//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start()
  {
//----
   int a=3,b=4;
   Comment("Start: a=",a,"; b=",b);
   Sleep(5000);
//----
   return(0);
  }
//+------------------------------------------------------------------+
void deinit() {
   Comment("Deinit: a=",a,"; b=",b);
   Sleep(2000);
   Comment("");
}
P.S. Ну вот Rosh, как всегда опередил :)
Причина обращения: