Extern в C++

C++ Программирование и разработка

Слово «extern» в C ++ является спецификатором. Его использование в C ++ объясняется в этой статье для переменных и функций. Сначала дается значение объявления и определения в C ++. Рассмотрим следующие строки кода:

    int it;

char fn(int itg, char ch);

it = 5;

char fn(int itg, char ch) {
char var = ‘o’;
if (itg == 1 && ch == ‘a’)
var = ‘z’;
return var;
}

Первая строка — это объявление переменной. Вторая строка была бы сигнатурой функции, если бы она никогда не заканчивалась точкой с запятой, за которой следовало бы тело функции. Эта вторая строка, оканчивающаяся точкой с запятой, является прототипом функции. Это также объявление функции. Третья строка присваивает значение целочисленной переменной: это инициализация переменной, но ее можно грубо рассматривать как определение переменной. Остальная часть кода — это определение функции. Он начинается с сигнатуры функции, за которой следует тело функции.

В C ++ есть нюанс, когда речь идет об объявлении и определении. Следующий оператор является объявлением переменной:

    int it = 5;

Подобное полное объявление переменной, в котором переменная вводится, а затем ей присваивается значение, остается объявлением переменной. Итак, объявление переменной может просто вводить переменную или вводить ее вместе с определением.

Следующий код (скопированный сверху) является объявлением функции:

    char fn(int itg, char ch) {
char var = ‘o’;
if (itg == 1 && ch == ‘a’)
var = ‘z’;
return var;
}

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

Итак, объявление может быть с определением или без него. Определение похоже на часть объявления. Для переменной присвоение значения в первый раз фактически является инициализацией, а не определением. Когда переменная объявляется впервые без инициализации, ее местоположение в памяти уже указано, но оно пустое. Установка значения в этом месте — это инициализация, завершающая определение.

Традиционно простое приложение на C ++ состоит из трех файлов. У него есть главный файл, который можно назвать первым файлом. У него есть второй файл и файл заголовка. Использование спецификатора extern может уменьшить количество файлов до двух (с трех). В этой статье объясняется использование спецификатора extern с переменными и функциями, чтобы избежать файла заголовка. Примечание: в словаре C ++ такие два файла называются единицами перевода.

Заголовочный файл без внешнего

Традиционно простое приложение C ++ имеет три файла: основной файл с функцией main (), которую можно назвать первым файлом, второй файл и файл заголовка. Заголовочный файл должен содержать объявления переменных и функций без их определений. Определения объявлений заголовков должны быть во втором файле. Вверху первого файла должно быть,

    #include «head.hh»

Где head.hh — это имя файла заголовка, который находится в домашнем каталоге пользователя. Директива include не заканчивается точкой с запятой. В этой ситуации объявлениям переменных без определений и прототипам функций без определений функций в файле заголовка не должен предшествовать спецификатор extern. И приложение должно работать.

Illustration

Указанные выше переменная и функция используются здесь для иллюстрации.

Введите следующий код в текстовом редакторе и сохраните его в домашнем каталоге пользователя с именем head.hh:

    int it = 5;
char fn(int itg, char ch);

В заголовке всего два утверждения. Затем введите следующее в безымянный документ текстового редактора и сохраните в домашнем каталоге пользователя с именем second.cpp:

    char fn(int itg, char ch) {
char var = ‘o’;
if (itg == 1 && ch == ‘a’)
var = ‘z’;
return var;
}

Затем введите следующий код в другой безымянный документ текстового редактора и сохраните его в домашнем каталоге пользователя с именем first.CPP:

    #include «head.hh»
#include
using namespace std;

int main()
{
cout << it << endl;
cout << fn(1‘a’) << endl;

return 0;
}

Скомпилируйте приложение с помощью следующей команды терминала:

    g++ first.cpp second.cpp o complete.exe

Запустите приложение с помощью,

    ./complete.exe

Результат:

    5
z

К сожалению, заголовочный файл не позволяет просто объявить переменную (например, ее) без инициализации. Однако эту проблему можно решить, как показано ниже.

extern без файла заголовка

Заголовочный файл можно удалить, если правильно использовать спецификатор extern. В этой ситуации будет объявление для переменной и функции, каждое без определения в первом (основном) файле. Каждому будет предшествовать extern.

Illustration

Введите следующий код в текстовом редакторе и сохраните его в домашнем каталоге пользователя с именем first.cpp:

    #include
using namespace std;

extern int it;

extern char fn(int itg, char ch);

int main()
{
cout << it << endl;
cout << fn(1‘a’) << endl;

return 0;
}

Затем введите следующее в безымянный документ текстового редактора и сохраните в домашнем каталоге пользователя с именем second.cpp:

int it = 5 ;

char fn ( int itg, char ch ) {
char var = ’о’ ;
если ( itg == 1 && ch == ’a’ )
var = ’z’ ;
return var ;
}

Определение переменной и функции произошло во втором файле. В первом файле они были объявлены без определения. В это новое приложение не был включен заголовок. Задействованы только два файла. Обратите внимание, что переменная полностью объявлена ​​во втором файле, но без слова extern. Даже функция также была объявлена ​​полностью без слова extern. Однако слово «extern» должно предшествовать частичным объявлениям в первом файле.

Скомпилируйте приложение с помощью следующей команды терминала:

    g++ first.cpp second.cpp o complete.exe

Запустите приложение с помощью,

    ./complete.exe

Результат:

    5
z

То же, что и раньше, но без заголовочного файла.

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

Заголовочный файл и внешний

В указанном выше приложении возникла проблема, заключающаяся в том, что переменная должна быть полностью объявлена ​​в файле заголовка. Чтобы иметь объявление переменной в файле заголовка без определения, переменной должен предшествовать extern. Итак, если есть,

    extern int it;

в файле заголовка будет

    int it = 5;

во втором файле, и все равно будет

    #include «head.hh»

Вверху первого файла (основного файла).

Постоянный и внешний

В нормальных условиях необходимо инициализировать константу. Например,

    const char ch = ‘e’;

разрешено и

    const char ch;

Не разрешено.

Однако с помощью спецификатора extern можно объявить константу без инициализации в первом и втором файлах. Итак, если в первом файле есть

    extern const char ch;

во втором файле будет

    char ch = ‘e’;

Без const во втором файле. ch в обоих файлах — это одна и та же сущность.

Замените файл first.cpp следующим содержимым и сохраните:

    #include
using namespace std;

extern const char ch;

int main()
{
cout << ch << endl;

return 0;
}

Замените файл second.cpp следующим содержимым и сохраните:

    char ch = ‘e’;

Скомпилируйте приложение с помощью следующей команды терминала:

    g++ first.cpp second.cpp o complete.exe

Запустите приложение с помощью,

    ./complete.exe

На выходе должно быть: e.

extern и static

Спецификаторы класса хранения в C ++ статические, thread_local, extern, изменяемые. В одном объявлении можно использовать не более одного из них. Однако в некоторых случаях thread_local и static могут появляться перед объявлением объекта, или thread_local и extern могут появляться перед объявлением объекта. Таким образом, extern и static никогда не могут быть спецификаторами объявления.

Заключение

Спецификатор extern связывает два объявления одной и той же сущности, которые находятся в двух разных файлах. Объявление, имеющее спецификатор extern, не должно инициализироваться или определяться. Объявление в другом файле, не имеющее спецификатора extern, должно быть инициализировано или определено. Эта схема применима к переменным и функциям. Это устраняет необходимость в файле заголовка для интересующих переменных и функций. Это позволяет объявлять константу без инициализации в одном файле и в другом файле. Если программисту нужен файл заголовка, то для того, чтобы иметь переменную в файле заголовка, без инициализации, программист должен использовать extern для переменной в файле заголовка.

Читайте также:  Что такое функция накопления в C++?
Оцените статью
bestprogrammer.ru
Добавить комментарий