Области видимости
Бывает два типа областей видимости: глобальная и локальная.
Глобальная область видимости
Каждый исходный файл (.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>