#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::»