Аз съм студент и съм объркан относно глобалните и файловите променливи в C и C++. Има ли разлика в двете гледни точки? Ако да, моля обяснете подробно.
Разлика между File Scope и Global Scope
Отговори (5)
Променлива с файлов обхват може да бъде достъпна от всяка функция или блок в рамките на един файл. За да декларирате променлива с обхват на файл, просто декларирайте променлива извън блок (същото като глобална променлива), но използвайте ключовата дума static.
static int nValue; // file scoped variable
float fValue; // global variable
int main()
{
double dValue; // local variable
}
Променливите с обхват на файл действат точно като глобалните променливи, с изключение на това, че използването им е ограничено до файла, в който са декларирани.
Може би е по-ясно да се илюстрира обхват на файл (или по-точно единица за превод) срещу глобален обхват, когато всъщност има множество единици за превод...
Вземете 2 файла (всеки е своя собствена единица за превод, тъй като те не включват един друг)
other.cpp
float global_var = 1.0f;
static float static_var = 2.0f;
main.cpp
#include <cstdio>
extern float global_var;
//extern float static_var; // compilation error - undefined reference to 'static_var'
int main(int argc, char** argv)
{
printf("%f\n", global_var);
}
Следователно разликата е ясна.
Името има file scope
, ако декларацията на идентификатора се появява извън всеки блок. Име с обхват на файла и вътрешна връзка се вижда от точката, в която е декларирано, до края на единицата за превод.
Global scope
или global namespace scope
е най-външният обхват на пространство от имена на програма, в който могат да се дефинират обекти, функции, типове и шаблони. Едно име има глобален обхват на пространството от имена, ако декларацията на идентификатора се появява извън всички блокове, пространства от имена и класове.
Пример:
static int nValue; // file scoped variable
float fValue; // global variable
int main()
{
double dValue; // local variable
}
Прочетете повече тук.
Файлов обхват: Всяко име, декларирано извън всички блокове или класове, има файлов обхват. Той е достъпен навсякъде в единицата за превод след декларирането му. Имената с файлов обхват, които не декларират статични обекти, често се наричат глобални имена.
В C++ файловият обхват е известен също като обхват на пространството от имена.
Прочетете това внимателно сега.
Използвате тези #include‹'...'.h> изрази в горната част на вашата програма/код. Това, което всъщност правите там, е да кажете на компютъра да се обърне към функциите, предварително записани в тези *h*eader файлове. Тоест тези функции имат обхват на файла. Вие не пишете кода на printf scanf и функции като тези, защото те са някъде в заглавните файлове.
Променливите, декларирани извън функция, имат "файлов обхват", което означава, че са видими във файла. Променливите, декларирани с файлов обхват, са видими между тяхната декларация и края на компилационната единица (.c файл) и те имплицитно имат външна връзка и по този начин са видими не само за .c файла или компилационната единица, съдържаща техните декларации, но и за всеки друг компилираща единица, която е свързана, за да формира пълната програма.
Глобалните променливи могат, както подсказва името, да се считат за достъпни глобално (навсякъде)