Я студент, и меня смущают глобальные и файловые переменные области видимости в C и C ++.
Есть ли разница в обеих перспективах? Если да, пожалуйста, объясните подробно.
Переменная с областью видимости файла может быть доступна для любой функции или блока в пределах одного файла. Чтобы объявить переменную области файла, просто объявите переменную вне блока (так же, как глобальную переменную), но используйте ключевое слово static.
static int nValue; // file scoped variable
float fValue; // global variable
int main()
{
double dValue; // local variable
}
Переменные области файла действуют точно так же, как глобальные переменные, за исключением того, что их использование ограничено файлом, в котором они объявлены.
Имя имеет file scope
если объявление идентификатора появляется за пределами какого-либо блока. Имя с областью действия файла и внутренней связью видно с точки, где оно объявлено, до конца модуля перевода.
Global scope
или же global namespace scope
является самой внешней областью имен программы, в которой могут быть определены объекты, функции, типы и шаблоны. Имя имеет глобальную область пространства имен, если объявление идентификатора появляется вне всех блоков, пространств имен и классов.
Пример:
static int nValue; // file scoped variable
float fValue; // global variable
int main()
{
double dValue; // local variable
}
Прочитайте больше Вот.
Область действия файла: любое имя, объявленное вне всех блоков или классов, имеет область действия файла. Он доступен в любом месте блока перевода после его объявления. Имена с областью файла, которые не объявляют статические объекты, часто называют глобальными именами.
В C ++ область действия файла также называется областью пространства имен.
Возможно, будет проще проиллюстрировать область действия файла (единицы перевода) в сравнении с глобальной областью действия, когда фактически существует несколько единиц перевода …
Возьмите 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);
}
Отсюда разница очевидна.
Прочитайте это внимательно сейчас.
Вы используете эти #включают<‘…’. Ч> заявления в верхней части вашей программы / кода.
То, что вы на самом деле делаете, — это говорит компьютеру обратиться к функции написаны в тех *час* eader files. То есть эти функции имеют область видимости файла. Вы не пишете код printf scanf и такие функции, как эти, они находятся где-то в заголовочных файлах.
Переменные, объявленные вне функции, имеют «область видимости файла», то есть они видны внутри файла. Переменные, объявленные с областью действия файла, видны между их объявлением и концом модуля компиляции (файл .c), и они неявно имеют внешнюю связь и, таким образом, видны не только для файла .c или модуля компиляции, содержащего их объявления, но также и для всех остальных блок компиляции, связанный для формирования полной программы.
Глобальные переменные, как следует из названия, можно считать доступными глобально (везде)