C , использующий пространства имен в одном и том же вложенном пространстве имен

#c #header #namespaces

#c #заголовок #пространства имен

Вопрос:

Допустим, у меня есть пространство имен:

 namespace UI
{
}
  

И у меня есть другое пространство имен:

 namespace Domain
{
}
  

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

 namespace Domain
{
    namespace UI
    {
    }
}
  

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

Ответ №1:

Единственно возможными способами являются псевдонимы пространства имен или использование всего пользовательского интерфейса пространства имен в Domain::UI. В обоих случаях есть способ получить к нему доступ из пространства имен домена.

Примеры:

 namespace UI {
    class Test {

    };
}

namespace Domain {

}

namespace Domain {
    namespace UI {
        namespace _UI = ::UI;

        struct Test2 {
            _UI::Test param;
        };
    }
}

namespace Domain2 {

    namespace UI {
        using namespace ::UI;

        struct Test2 {
            Test param;
        };
    }
}
  

Комментарии:

1. да, точно, используйте ::UI при обращении к глобальному пространству имен.

2. Вау, у вас могут быть псевдонимы пространств имен, я даже не знал об этом. Еще один вопрос, если я использую 2-е решение для заголовка, импортирует ли это глобальный пользовательский интерфейс для всех применений пространства имен пользовательского интерфейса домена?

3. Нет, работает только с файлами, включающими «using namespace ::UI» или файлами, включающими заголовок с использованием. Пространство имен в C работает не так, как, например, пакеты в Go. Если у вас нет заголовка, определяющего что-либо, для этого нет видимости.