Разлика между File Scope и Global Scope

Аз съм студент и съм объркан относно глобалните и файловите променливи в C и C++. Има ли разлика в двете гледни точки? Ако да, моля обяснете подробно.


person Iqbal Haider    schedule 20.02.2014    source източник
comment
drdobbs.com/cpp/scope-regions-in-c/240002006   -  person odedsh    schedule 20.02.2014
comment
На подобен въпрос беше отговорено тук, може да искате да погледнете stackoverflow.com/questions/14027317/   -  person user376507    schedule 20.02.2014
comment
Искам да попитам да няма разлика между тях b/c във вашия въпрос споменах, че проверих, че примерите работят по същия начин в C++ за файл и глобален обхват, затова зададох този въпрос   -  person Iqbal Haider    schedule 20.02.2014


Отговори (5)


Променлива с файлов обхват може да бъде достъпна от всяка функция или блок в рамките на един файл. За да декларирате променлива с обхват на файл, просто декларирайте променлива извън блок (същото като глобална променлива), но използвайте ключовата дума static.

static int nValue; // file scoped variable
float fValue; // global variable

int main()
{
    double dValue; // local variable
}

Променливите с обхват на файл действат точно като глобалните променливи, с изключение на това, че използването им е ограничено до файла, в който са декларирани.

person Hitesh Vaghani    schedule 20.02.2014
comment
Това не е обхват на файла. Това е обхват на единица за превод. Можете да включите два или повече .cpp файла в един и те да имат достъп до статиките един на друг. - person Calmarius; 12.05.2018
comment
Този отговор обърква терминологията, поне за C. Обхватът на файла е просто извън всеки блок или списък с параметри (C99, 6.2.1/P4). И двете fValue и nValue са декларирани в обхвата на файла. Global не е C стандартна номенклатура. Това е народен термин за обекти, декларирани/дефинирани в обхвата на файла. И двете променливи са глобални и двете са декларирани в обхвата на файла. Променливата да има външна или вътрешна връзка не я прави или-или файлов обхват/глобална. Моля, не се опитвайте да използвате тези термини, за да посочите връзка. - person Tammi; 09.03.2021

Може би е по-ясно да се илюстрира обхват на файл (или по-точно единица за превод) срещу глобален обхват, когато всъщност има множество единици за превод...

Вземете 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);
}

Следователно разликата е ясна.

person Rufus    schedule 29.08.2018

Името има file scope, ако декларацията на идентификатора се появява извън всеки блок. Име с обхват на файла и вътрешна връзка се вижда от точката, в която е декларирано, до края на единицата за превод.

Global scope или global namespace scope е най-външният обхват на пространство от имена на програма, в който могат да се дефинират обекти, функции, типове и шаблони. Едно име има глобален обхват на пространството от имена, ако декларацията на идентификатора се появява извън всички блокове, пространства от имена и класове.

Пример:

static int nValue; // file scoped variable
float fValue; // global variable

int main()
{
    double dValue; // local variable
}

Прочетете повече тук.

person Raging Bull    schedule 20.02.2014

Файлов обхват: Всяко име, декларирано извън всички блокове или класове, има файлов обхват. Той е достъпен навсякъде в единицата за превод след декларирането му. Имената с файлов обхват, които не декларират статични обекти, често се наричат ​​глобални имена.

В C++ файловият обхват е известен също като обхват на пространството от имена.

person user3148898    schedule 20.02.2014

Прочетете това внимателно сега.

Използвате тези #include‹'...'.h> изрази в горната част на вашата програма/код. Това, което всъщност правите там, е да кажете на компютъра да се обърне към функциите, предварително записани в тези *h*eader файлове. Тоест тези функции имат обхват на файла. Вие не пишете кода на printf scanf и функции като тези, защото те са някъде в заглавните файлове.

Променливите, декларирани извън функция, имат "файлов обхват", което означава, че са видими във файла. Променливите, декларирани с файлов обхват, са видими между тяхната декларация и края на компилационната единица (.c файл) и те имплицитно имат външна връзка и по този начин са видими не само за .c файла или компилационната единица, съдържаща техните декларации, но и за всеки друг компилираща единица, която е свързана, за да формира пълната програма.

Глобалните променливи могат, както подсказва името, да се считат за достъпни глобално (навсякъде)

person user596031    schedule 20.02.2014