Прототип (описание) функции. Понятие глобального объекта

 

Локальные объекты определяются (создаются) в теле объекта-функции.

Локальный объект «живет» в этой функции, то есть может быть доступен и записанная в нем информация не будет разрушена, пока функция активна, то есть выполняются ее инструкции. Локальный объект, определенный в функции «жив», но может быть не виден в ней.

Локальный объект «виден» в блоке функции, то есть информация, записанная в нем, доступна для обработки, только в области памяти этой функции от точки определения объекта в инструкции его определения до конца блока, в котором он определен. Блок задается фигурными скобками { }.

 

Объект может быть определен вне тела функции. Объект, созданный вне функции, называется глобальным объектом. Поведение такого объекта не такое, как поведение локального объекта.

Глобальный объект «жив» так долго, пока выполняется программа, в которой он определен. Область видимости глобального объекта определяется от точки его определения или описания до точки конца файла, в котором он определен или описан.

Функция, будучи объектом, определенным вне тел других функций программы, является по отношении к ним глобальным объектом. В программе, которую разработали выше, функции в файле были расположены в следующем порядке: первая функция countX, за тем функция main.

 

 

// В файле example1.cpp записаны функция countX, а затем main

Define _USE_MATH_DEFINES

#include <math.h>

#include <iostream>

#include <conio.h>

using namespace std;

float countX (float a, float b, float c )

{

float x;

x= (a * cos(b + c) - b * sin(a + c)) / (pow(a,3) + b * b);

return x;

}

// --

void main ( void )

{

сout << endl << "vvedite a, x1, x2 ";

float x1, a, x2;

cin>>a>>x1>>x2;

float vir1;

vir1 = countX ( x1*x1, x2, M_PI_2); //здесь функция countX видна

float vir2;

vir2 = countX ( x2, x1 + 1.2, 0); // здесь функция countX видна

float x = 1./11 + a * vir1 + 1 / vir2;

cout << endl << "X = " << x;

getch();

}

// --

 

Определение функции countX состоит из заголовка функции и ее тела (показано желтым цветом).

Область видимости этой функции показана голубым цветом. В точке, где вызывается функция countX, она видна и может быть использована.

Изменим последовательность расположения текстов в программе, записаном в одном файле example2.cpp. Функция countX вызывается в точке, где она не видна.

 

// файл example2.cpp

// Изменили порядок записи функций в файле, функция main записана первой

Define _USE_MATH_DEFINES

#include <math.h>

#include <iostream>

#include <conio.h>

using namespace std;

void main ( void )

{

сout << endl << "vvedite a, x1, x2 ";

float x1, a, x2;

cin>>a>>x1>>x2;

float vir1;

vir1 = countX ( x1*x1, x2, M_PI_2); // здесь функция countX не видна!

float vir2;

vir2 = countX ( x2, x1 + 1.2, 0); // здесь функция countX не видна!

float x = 1./11 + a * vir1 + 1 / vir2;

cout << endl << "X = " << x;

getch();

}

float countX (float a, float b, float c )

{

float x;

x= (a * cos(b + c) - b * sin(a + c)) / (pow(a,3) + b * b);

return x;

}

Здесь функция countX видна

 

 

При попытке компиляции этого текста выдается сообщение об ошибке:

Сообщение в окне List Error

Error 2 error C3861: 'countX': identifier not found ……\пример2\example2.cpp 15

Error 3 error C3861: 'countX': identifier not found ……\пример2\example2.cpp 16

 

Как, не изменяя расположения функций в файле, расширить область видимости функции countX?

Необходимо вспомнить, что глобальный объект виден от точки его определения или от точки его описания до точки конца файла, в котором этот объект определен или описан.

 

Описание функции (прототип функции) – это точная копия заголовка функции, после которого стоит точка с запятой (ведь это инструкция!):

float countX (float a, float b, float c );

 

 

Добавим прототип функции (инструкцию описания объекта-функции) перед функцией main, в которой необходимо использовать объект, а следовательно его видеть.

// файл example2.cpp

// Изменили порядок записи функций в файле, функция main записана первой

Define _USE_MATH_DEFINES

#include <math.h>

#include <iostream>

#include <conio.h>

using namespace std;

float countX (float a, float b, float c );

void main ( void )

{

сout << endl << "vvedite a, x1, x2 ";

float x1, a, x2;

cin>>a>>x1>>x2;

float vir1;

vir1 = countX ( x1*x1, x2, M_PI_2); // здесь функция countX стала видна!

float vir2;

vir2 = countX( x2, x1 + 1.2, 0); // здесь функция countX стала видна!

float x = 1./11 + a * vir1 + 1 / vir2;

cout << endl << "X = " << x;

getch();

}