Как я могу отменить использование пространства имен?

Одна из капризов моей системы разработки (Codegear C++Builder) заключается в том, что некоторые из автоматически сгенерированных заголовков требуют наличия...

using namespace xyzzy

... операторы в них, которые влияют на мой код, когда я меньше всего этого хочу или ожидаю.

Есть ли способ, которым я могу как-то отменить/переопределить предыдущий оператор «использования», чтобы избежать этого.

Может быть...

unusing namespace xyzzy;

person Roddy    schedule 03.10.2008    source источник
comment
Вероятно, вам следует открыть отчет об ошибке в их системе контроля качества: qc.codegear.com   -  person Kris Kumler    schedule 03.10.2008
comment
Кстати, какие это автоматически сгенерированные заголовки?   -  person Kris Kumler    schedule 17.10.2008
comment
Когда-нибудь в C++ появятся модули, а включение кода в другой код будет иметь лучшие конструкции инкапсуляции. До тех пор нет простого способа обойти это. Подумайте о том, чтобы поместить свой собственный код в пространство имен и ссылаться на него таким образом.   -  person Trevor Hickey    schedule 30.06.2015


Ответы (7)


Неа. Но есть потенциальное решение: если вы заключите свою директиву include в собственное пространство имен, вот так...

namespace codegear {
    #include "codegear_header.h"
} // namespace codegear

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

В некоторых случаях это может быть проблематично. Вот почему каждое руководство по стилю C++ настоятельно рекомендует не помещать директиву «использование пространства имен» в заголовочный файл.

person Head Geek    schedule 03.10.2008
comment
В общем, это ужасная идея. Заголовки C++ не предназначены для включения в альтернативное пространство имен, как здесь. - person Aaron; 03.10.2008
comment
Плохая идея также включать директиву using в заголовочный файл. Это просто смягчает эту проблему. - person Head Geek; 03.10.2008
comment
Размещение заголовка в собственном пространстве имен не является решением, поскольку оно меняет смысл объявлений в этой библиотеке. (-1) - person Richard Corden; 05.10.2008
comment
Вот почему я сказал, что в некоторых случаях это может быть проблематично. Родди не включил никаких подробностей о содержании этих автоматически сгенерированных заголовков. - person Head Geek; 05.10.2008
comment
Проблемный не совсем резюмирует, что это приведет к неопределенному поведению, которое, если вам повезет, может привести к ошибкам ссылки. - person Richard Corden; 06.10.2008
comment
Это полностью зависит от того, что объявляется в заголовке. - person Head Geek; 08.10.2008
comment
Именно поэтому это неопределенное поведение. - person Kris Kumler; 17.10.2008
comment
Поскольку заголовки генерируются автоматически, я предполагаю, что любой код для них будет таким же. Предположительно, его можно изменить, чтобы поместить его функции в то же пространство имен с минимальными усилиями со стороны Родди. - person Head Geek; 17.10.2008

Нет, вы не можете не использовать пространство имен. Единственное, что вы можете сделать, это поместить оператор using namespace в блок, чтобы ограничить его область действия.

Пример:

{
    using namespace xyzzy;

} // stop using namespace xyzzy here

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

person jk.    schedule 03.10.2008
comment
Можете ли вы обернуть включение в такой блок? - person Eclipse; 03.10.2008
comment
Да, этого не будет с автоматически сгенерированным кодом. Быт мэб он может изменить шаблон на авто сгенерированный код? - person jk.; 03.10.2008
comment
Да, на самом деле это не решает проблему заголовков, использующих пространства имен. - person Kip; 03.10.2008
comment
К сожалению, это не так. Попробуй это: - person Adam; 21.10.2010
comment
пространство имен xyzzy{ const int i{ использование пространства имен xyzzy; } // прекратить использование пространства имен xyzzy здесь - person Adam; 21.10.2010
comment
эээ, здесь серьезные проблемы с вводом. И в любом случае мое утверждение было неверным. Прости. - person Adam; 21.10.2010

Вы можете застрять, используя явные пространства имен в конфликтах:

string x; // Doesn't work due to conflicting declarations
::string y; // use the class from the global namespace
std::string z; // use the string class from the std namespace
person Eclipse    schedule 03.10.2008

Для справки в будущем: начиная с версии XE есть новое значение, которое вы можете #define избежать страшного using namespace System; int для включения: DELPHIHEADER_NO_IMPLICIT_NAMESPACE_USE

person cdelacroix    schedule 10.01.2011
comment
Но это, кажется, не работает должным образом. По крайней мере, во всех случаях, которые я пробовал (с BCB6). Затем я возвращался к добавлению явных пространств имен в случае конфликта и, что еще хуже, включал заголовок, чтобы избежать конфликтов имен типов... - person Wolf; 02.09.2014

Как насчет использования sed, perl или другого инструмента командной строки в процессе сборки для изменения сгенерированных заголовков после их создания, но до их использования?

person Community    schedule 03.10.2008

Быстрый эксперимент с Visual Studio 2005 показывает, что вы можете поместить эти заголовки в свое собственное именованное пространство имен, а затем use то, что вам нужно, из этого пространства имен (но не use все пространство имен, так как оно представит пространство имен, которое вы хотите скрыть.

person Kasprzol    schedule 03.10.2008
comment
Это, вероятно, вызовет проблемы с искажением имен, если заголовочные файлы являются объявлениями для библиотеки. Компиляция завершится успешно, но компоновщик не сможет найти определения, так как они уже были скомпилированы в другом пространстве имен. - person Eclipse; 03.10.2008

person    schedule
comment
пожалуйста объясните свой ответ! - person Mazz; 26.04.2017
comment
вы можете использовать оператор разрешения области, чтобы использовать другую переменную пространства имен - person Narendra kumawat; 26.04.2017
comment
Не решает вопрос - person M.M; 02.05.2017