Специфікатори глобальних змінних 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Специфікатори глобальних змінних



В оголошеннях глобальних змінних можна використовувати тільки специфікатори static i extern. Ці специфікатори найчастіше застосовують при створенні багато файлових програм.

Кожна глобальна змінна має бути визначена (тобто описана) тільки один раз, в разі багато файлових програм – в одному з файлів. Опис змінної пов’язаний з виділенням для неї оперативної пам'яті, обсяг якої визначається типом цієї змінної. Для глобальної змінної пам’ять виділяється в сегменті даних програми і заповнюється нулями, якщо в описі змінну не ініціалізують іншим значенням.

В описах змінних зовнішнього рівня або взагалі не використовують специфікаторів, або вказують специфікатор static – в цьому випадку це означає, що областю дії даної змінної буде частина програми від опису змінної до кінця файлу. В інших файлах програми ця змінна недоступна, тому усувається загроза випадкової зміни її значення. Крім того, в інших файлах можна використовувати свої глобальні змінні з тим самим іменем, оскільки всі однойменні змінні з специфікатором static незалежні.

Кожен програмний файл багато файлової програми може компілюватись автономно. Тому, щоб забезпечити можливість звертання до глобальних змінних, описаних в інших файлах, треба в даному файлі оголосити потрібні глобальні змінні ще раз з використанням специфікатора extern. Таке оголошення не пов’язане з виділенням пам'яті для змінних, отже змінні з специфікатором extern не можна ініціалізувати – вони є посиланнями на відповідні зовнішні змінні та роблять ці змінні видимими (оголошеними) в межах поточного файлу.

Таким чином, кожен об’єкт програми повинен бути описаний тільки один раз, але може бути оголошений багаторазово. Найчастіше це стосується прототипів функцій і змінних з специфікатором extern. Для більшості змінних програми описи та оголошення збігаються.

Багатофайлові програми

В невеликих за розміром програмах функцію main і всі інші функції доцільно записувати в одному текстовому файлі. Якщо програма велика і складна, то доцільно поділити її на декілька програмних файлів, код кожного з яких можна створювати і компілювати автономно.

У багато файлових програмах питання видимості постають у межах одного файлу та на меж файловому рівні. Встановлено такі правила:

1) об’єкти, оголошені на зовнішньому рівні (тобто між функціями), є частково глобальними, область їх дії – від точки оголошення до кінця програмного файлу;

2) щоб звернутись до глобальної змінної, описаної в іншому файлі, необхідно в поточному файлі оголосити цю змінну з специфікатором extern;

3) функції є глобальними об’єктами, тобто вони описуються тільки один раз, областю їх дії є вся програма;

4) прототипи функцій є частково видимими, вони діють в межах одного програмного файлу.

Згідно з третім правилом кожна функція повинна бути описана тільки один раз в програмі у якомусь з файлів. Для звертання до функції з інших файлів або перед її описом у тому ж файлі треба попередньо вказати прототип функції. Областю дії прототипу функції є один програмний файл, тому в кожному файлі програми треба окремо оголошувати прототипи всіх необхідних функцій.

Зазвичай створюють заголовний файл, в якому записують декларації шаблонів структурних типів і прототипи функцій і файл з розширенням срр, в якому функції описані повністю. Наприклад:

 

#include <iostream>

#include "fibonachi.h"

using namespace std;

int main() {

cout << fib(46);

}

// fibonachi.h

#ifndef FIBONACHI

#define FIBONACHI

long fib(long n);

#endif

// fibonachi.cpp

#include "fibonachi.h"

static long knownf[ 47 ];

void init_fibo(void) {

knownf[ 0 ]=0;

knownf[ 1 ]=1;

for(int i = 2; i < 47; i++)

knownf[ i ] = -1;

}

long fib(long n) {

static int num;

if (++num == 1) init_fibo();

if (knownf[ n ]!= -1)

     return knownf[ n ];

else {

     knownf[ n ] = fib(n - 1) + fib(n - 2);

     return knownf[ n ];

}

}

Робота з файлами

Звертання до файлів

Для роботи з файлами необхідно підключити бібліотеку fstream. Файл, як і будь-яку іншу змінну, необхідно оголосити. Це можна зробити таким чином:

 

ofstream fn ("test.txt", ios::app);

 

Тут fn – змінна, за допомогою якої будуть виконуватись звертання до файлу з програми, test.txt – ім’я файлу на диску, ios::app – режим звертання до файлу.

Існують такі режими звертання до файлу: ios::in – читання з файлу, для потоку ifstream встановлюється за замовчуванням, курсор встановлюється в початок файлу за замовчуванням; ios::out – запис поверх існуючої, для потоку ofstream встановлюється за замовчуванням, курсор встановлюється в початок файлу за замовчуванням; ios::ate – запис і зчитування, запис поверх існуючої, курсор встановлюється в початок файлу за замовчуванням; ios::app – запис, додавання в кінець файлу після існуючого запису.

Таким чином, команда з останнього приклада буде відкривати файл з іменем test.txt, який знаходиться в тому самому каталозі, що і програма. Файл відкривається для запису, якщо файл не існує – він буде створений.

Для того, щоб відкрити файл як для зчитування, так і для запису, необхідно виконати таку команду:

 

ifstream fn ("test.txt", ios::in | ios::out);

 

Тут два аргумента ios::in і ios::out об’єднані за допомогою оператора |. Результат виконання цієї операції можна перевірити таким чином:

 

if (!fn) {

cout << "Error opening file\n";

exit(1);

}

 

В результаті виконання функції exit програма завершається. Аргумент цілого типу може приймати будь-яке значення, але традиційно вважають, що значенню аргументу 1 відповідає завершення програми через помилку, значенню аргумента 0 – нормальне завершення програми.

Після використання файлу його необхідно закрити:

 

fn.close();

 



Поделиться:


Последнее изменение этой страницы: 2021-12-15; просмотров: 33; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.12.162.179 (0.007 с.)