#c #объявление #global_variables
Возможно ли объявить глобальную переменную в функции? Если да, то как?
Ответы
Ответ 1
Объявить глобальную переменную в функции, то есть переменную с внешним или внутренним связыванием, можно. А, вот, определить такую переменную нельзя, так как глобальная переменная - это переменная определенная вне функции. Например, #includeint x; void f( int i ) { extern int x; x = i; } int main(void) { printf( "x = %d\n", x ); f( 10 ); printf( "x = %d\n", x ); return 0; } Вывод программы на консоль x = 0 x = 10 В этой программе в функции f объявляется глобальная переменная x extern int x; Ответ 2
Объявить или определить? Возможно, я несколько путаюсь в терминологии, тогда пусть меня поправят, но если я правильно понимаю, то int x = 5; // Определение глобальной переменной int main(int argc, const char * argv[]) { extern int x; // Ее объявление, локальное для функции main() printf("%d\n",x); } Более того, они могут находиться в разных файлах.Ответ 3
Нет, невозможно. Всё, что объявлено в функции, видно только в ней. Это основной принцип структурного программирования, называющийся «область видимости». Возможностью межпроцедурного доступа обладают только глобальные переменные. Крайне желательно использовать static-переменные, уровня .c-файла, но в крайнем случае допустимо использовать и действительно глобальные переменные, уровня всей программы. Разумеется, можно: Приписать к локальной переменной модификатор static, тогда она переживёт выход из функции в силу особого смысла этого ключевого слова при локальных переменных; Вернуть из функции указатель на эту переменную. Передать этот указатель внутрь другой функции, которая сохранит его внутри своей статической локальной переменной. И это будет работать, так как статические локальные переменные хранятся не на стеке. Однако лучше переместить эту переменную в структуру, как бы хранящую состояние между вызовами, и передавать эту структуру обеим функциям по указателю. Тогда: Первая функция будет записывать данные в экземпляр структуры (инициализировать её); Вторая функция будет просто читать и писать в эту структуру. Чтобы посторонние не могли вмешаться в массив, воспользуйтесь шаблоном проектирования «прозрачный указатель»: вынесите обе функции и определение структуры в отдельный .c-файл, а остальной программе предоставьте прототипы функций и краткого определения структуры, достаточного для объявления указателей на неё (typedef struct MyStruct;). Заметьте, в любом случае придётся что-то передавать в качестве параметра второй функции.Ответ 4
Читаем АВТОРОВ языка: Объекты, объявляемые вне всех блоков на одном уровне с определениями функций, всегда статические, и они становятся глобальными для всей программы. "Язык программирования Си" - Брайан В. Керниган, Деннис М. Ритчи
Комментариев нет:
Отправить комментарий