Урок №24. Конфликт имен и std namespace



Книга Урок №24. Конфликт имен и std namespace

В рамках данного занятия мы изучим понятие конфликта имен в языке программирования C++ и способы его разрешения с применением пространств имен и оператора разрешения области видимости.

Конфликт имен в C++

Предположим, что вам необходимо поехать к дальним родственникам в другой город. У вас имеется лишь их адрес: г. Ржев, ул. Вербовая, 13. Прибыв в город Ржев, вы запускаете приложение Google Карты/Яндекс.Карты и обнаруживаете, что существует две улицы с наименованием Вербовая, причем расположены они в разных частях города! Какая из них вам нужна? Если у вас нет никакой дополнительной информации (например, вы знаете, что их дом находится рядом с аптекой или школой), вам придется связаться с ними и уточнить. Для того чтобы избежать подобных недоразумений, все названия улиц в городе должны быть уникальными.

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

Пример ситуации, когда имена конфликтуют друг с другом:

Файл a.cpp:

#include

void doSomething ( int x )

{

std :: cout << x ;

}

Файл b.cpp:

#include

void doSomething ( int x )

{

std :: cout << x * 2 ;

}

Файл main.cpp:

void doSomething ( int x ) ; // предварительное объявление функции doSomething()

int main ( )

{

doSomething ( 5 ) ;

return 0 ;

}

Если скомпилировать файлы a.cpp, b.cpp и main.cpp по отдельности, то все будет в порядке. Однако, если объединить a.cpp и b.cpp в один проект, возникнет проблема с конфликтом имен из-за наличия одинакового определения функции doSomething() в обоих файлах.

В большинстве случаев конфликты имен возникают по двум причинам:

В случае, если в один проект добавлены файлы с одинаковыми именами функций или глобальных переменных, возникает ошибка на этапе линковки.

При компиляции файла .cpp возникает ошибка из-за конфликта идентификаторов с заголовочным файлом.

По мере увеличения размера программ, количество используемых идентификаторов также увеличивается. Это увеличивает вероятность возникновения конфликтов имен. Однако в языке C++ существует достаточно механизмов для предотвращения таких конфликтов, таких как локальная область видимости и пространства имен. Это хорошая новость.

Пространство имен

В ранних версиях языка C++ была возможность использовать все идентификаторы из стандартной библиотеки C++ (например, cin/cout и т.д.) напрямую. Однако это могло привести к конфликтам имен, так как любой идентификатор из стандартной библиотеки C++ мог пересекаться с именем, выбранным для собственных идентификаторов. Код, который ранее работал без проблем, мог внезапно столкнуться с конфликтом имен при добавлении нового заголовочного файла из стандартной библиотеки C++. Или, что еще хуже, код, написанный в соответствии со стандартами одной версии языка C++, мог перестать работать в новой версии. Для решения этой проблемы весь функционал стандартной библиотеки C++ был помещен в специальное пространство имен (namespace).

Точно так же, как город обеспечивает уникальные названия для всех улиц в своих границах, пространство имен гарантирует уникальность всех своих идентификаторов.

Поэтому, std::cout можно разделить на две части: cout - это идентификатор, а std - это пространство имен. Вся функциональность Стандартной библиотеки C++ определена внутри пространства имен std (сокращение от "standard").

На будущих занятиях мы обсудим пространства имен и изучим процесс создания собственного пространства имен. Важно помнить, что при использовании идентификаторов из стандартной библиотеки C++ (например, cout), необходимо указать компилятору, что этот идентификатор находится внутри пространства имен std.

Следует помнить о следующем правиле: при использовании идентификаторов из определенного пространства имен необходимо указывать это пространство имен.

Оператор разрешения области видимости ::

Для того чтобы явно указать компилятору, что конкретный идентификатор находится в определенном пространстве имен, можно воспользоваться оператором разрешения области видимости :: . Например:

std :: cout << "Hello, world!" ;

В данном месте мы указываем компилятору о нашем намерении использовать объект cout из пространства имен std.

183   0  

Comments

    Ничего не найдено.