Я студент, и меня смущают глобальные переменные и переменные области видимости файла в C и C++. Есть ли разница в обеих точках зрения? Если да, пожалуйста, объясните подробно.
Разница между областью действия файла и глобальной областью действия
Ответы (5)
Доступ к переменной с файловой областью может получить любая функция или блок в одном файле. Чтобы объявить переменную области действия файла, просто объявите переменную вне блока (так же, как и глобальную переменную), но используйте ключевое слово static.
static int nValue; // file scoped variable
float fValue; // global variable
int main()
{
double dValue; // local variable
}
Переменные с областью действия файла действуют точно так же, как и глобальные переменные, за исключением того, что их использование ограничено файлом, в котором они объявлены.
Возможно, будет понятнее проиллюстрировать файловую (или, точнее, единицу перевода) область действия по сравнению с глобальной областью, когда на самом деле существует несколько единиц перевода...
Возьмите 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);
}
Отсюда и очевидна разница.
Имя имеет 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 или единице компиляции, содержащей их объявления, но и всем остальным. единица компиляции, которая связана для формирования полной программы.
Глобальные переменные, как следует из названия, могут считаться доступными глобально (отовсюду).