Как ограничить область действия «использование пространства имен …»? c

#c #namespaces

Вопрос:

У меня есть файл с реализациями методов «мое пространство имен»(myns::), перед функциями есть много «myns::». Я хочу писать с использованием пространства имен, но оно будет отображаться в других файлах. Я не могу написать «статический» перед «использованием пространства имен mysp;».

my_namespace_file.h:

 namespace myns {
  void F1();
  void F2();
}
 

my_imp_file.h:

 #include "my_namespace_file.h"

// problem is here
using namespace myns;

void F1() {}
void F2() {}
 

если я использую здесь «использование пространства имен myns;» и включу файл my_imp_file.h в других файлах я не буду использовать в этих файлах «myns::»

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

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

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

3. @THND Не используйте using namespace операторы в заголовочных файлах, по крайней мере на глобальном уровне, именно по той причине, которую вы обнаруживаете. Используйте такие инструкции только в файлах реализации или внутри определенных областей, но, конечно, не на глобальном уровне.

Ответ №1:

Все просто, как это:

 #include "my_namespace_file.h"

namespace myns {

void A::F1() {} // class name must be repeated, because you cannot open namespace of the class
void A::F2() {}

}
 

Поскольку вы никогда #include не должны создавать файлы с реализациями, вы using namespace myns; также можете их использовать, но это может иметь неприятные последствия, если вы когда-либо создадите другой класс A в другом пространстве имен. Лучше просто правильно использовать пространство имен.

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

1. Просто напишите «пространство имен … {}» опять? Хорошо, я попробую

2. @THND Да. Пространства имен можно открывать столько раз, сколько потребуется. Нет предела тому, что вы делаете это только один раз или что-то в этом роде.

3. Можно ли использовать его таким образом? или лучше везде писать «myns::»

4. Плюсы/минусы: создание области для пространства имен вместо явной квалификации его для реализаций менее шумно и проще в работе. Однако, если это большое пространство имен, менее понятно, с чем вы работаете или откуда берутся имена. Также проще случайно добавить новые имена в пространство имен, которые вы не имели в виду. Если код использует много пространств имен, отсутствие квалификации может затруднить отслеживание, но если весь код в основном использует код из своего собственного (единого) пространства имен, то область открытого пространства имен обычно является лучшим выбором для снижения шума.

Ответ №2:

хорошее имя.h:

 namespace myns{
  extern void coolFunctionName(); // I exist!
}
 

nicecppfilename.cpp:

 #include "niceheadername.h" // I exist in "niceheadername.h"
void myns::coolFunctionName(){ // this is what I contain!
  //put content here
}
 

затем во всех других файлах, которые вы пишете #include "niceheadername.h" , чтобы сообщить компилятору, где найти эти функции.

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

1. кстати, если вы хотите использовать эту функцию в других файлах, вам нужно сказать myns::coolFunctionName(); или using myns; , потому что она находится в пространстве имен

2. Я знаю это, но я хочу кое-что записать в файл «nicecppfilename.cpp» чтобы не писать везде «myns::» (в этом файле), но если я использую это в других файлах, я должен написать «myns::»