Разница между областью действия файла и глобальной областью действия

Я студент, и меня смущают глобальные переменные и переменные области видимости файла в C и C++. Есть ли разница в обеих точках зрения? Если да, пожалуйста, объясните подробно.


person Iqbal Haider    schedule 20.02.2014    source источник
comment
Я хочу спросить не о разнице между ними, потому что в вашем вопросе упоминается, что я проверил, что примеры, которые работают одинаково в С++ для файла и глобальной области, поэтому я задал этот вопрос   -  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 файла (каждый из которых является собственной единицей перевода, поскольку они не включают друг друга)

другое.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