Области видимости

Бывает два типа областей видимости: глобальная и локальная.

Глобальная область видимости

Каждый исходный файл (.TBS или .TC), а также каждый файл HTML (.HTML) с кодом Tibbo BASIC или C содержит одну глобальную область видимости.

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

Глобальную переменную одного исходного файла нельзя использовать в другом исходном файле, если эта переменная не объявлена там:

declare dw as dword 'defined in some other file
extern unsigned long ul; //defined in some other file

Такие объявления обычно размещают в заголовочных файлах: .TPH для Tibbo BASIC и .TH для Tibbo C. Заголовочные файлы необходимо подключать к файлу с исходным кодом:

include "global.tbh"
#include "global.th"

Несмотря на сказанное, имена глобальных переменных должны быть уникальны во всём проекте. Определение двух глобальных переменных с одним именем в двух разных файлах вызовет ошибку компоновщика... с одним исключением:

В Tibbo C можно определять несколько статических глобальных переменных с одинаковыми именами в разных файлах. В Tibbo BASIC это невозможно, потому что он не поддерживает спецификатор класса памяти static.

Внимание

Типы переменных между файлами не сверяются. Можно определить f как тип word в одном файле, а затем объявить её как тип string в другом, и TIDE этого не заметит! Будьте очень внимательны!

Локальные области видимости

У каждой процедуры BASIC и C есть собственная локальная область видимости.

Особенность Tibbo BASIC и Tibbo C в том, что внутри управляющих конструкций есть ещё и более мелкие локальные (и вложенные) области видимости.

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

Локальные переменные и другие сущности можно определять на любом уровне области видимости!

Локальная переменная (или другая сущность) имеет приоритет над всеми переменными (а также именами процедур и другими сущностями) с тем же именем, определёнными во внешних (более высоких) областях видимости.

Вот пример кода, который объявляет переменную f в каждой возможной области видимости. Их здесь семь!

unsigned int f;            //1: global scope of this source file
void on_sys_timer(){
   unsigned char f;        //2: local scope of on_sys_timer(){}
   f=1;
lbl1:   if(f==1){
      unsigned int f;      //3: local sub scope inside else{}
      switch(f){
      case 0:
         bool f;           //4: local sub-sub scope inside "case"
         break;
      case 1:
         unsigned long f;  //5: local sub-sub scope inside "case"
         break;
      }
   }
   else{
      char f;              //6: local sub scope inside else{}
      for(f=0;f<11;f++){
         string f;         //7: local sub-sub scope inside for(;;)
         f="ABC";
      }
   }
   f=0;                    //continued -- local scope of on_sys_timer(){}
   goto lbl1;
}
//continued -- global scope

Области видимости в HTML

Особенность файлов HTML в том, что код BASIC/C внутри них не организован в процедуры. Весь файл HTML подобен одной большой процедуре.

Поэтому в файлах HTML нет области видимости уровня процедуры. Подобласти у управляющих конструкций остаются.

Вот один пример HTML (правила размещения кода в файлах HTML объясняются в разделе Работа с HTML):

<HTML>
<BODY>
BEGINNING OF OUTPUT<br>
<?
dim i as integer         '1: global scope of this source file
for i = 1 to 10
   dim i as byte=2       'local scope inside for-to
   const TIMER_CONST=10  'this const is only visible in this for-to scope
?>
<i> Foo </i>
<?
next i                   'continued -- global scope
?>
<br>END OF OUTPUT<br>
</BODY>
</HTML>
Исходный материал Tibbo обновлён 12 июля 2022Оригинал на docs.tibbo.com · Сообщить об ошибке