Обесценивая слегка различную семантику из-за ADL, как я должен вообще использовать using
и почему? Это зависит от ситуации (например, заголовок, который будет #include
d против исходного файла, который не будет)?
Кроме того, я должен предпочесть ::std::
или std::
?
Уровень пространства имен
using namespace
:using namespace std; pair<string::const_iterator, string::const_iterator> f(const string &s) { return make_pair(s.begin(), s.end()); }
Быть полностью явным:
std::pair<std::string::const_iterator, std::string::const_iterator> f(const std::string &s) { return std::make_pair(s.begin(), s.end()); }
Объявления использования на уровне пространства имен:
using std::pair; using std::string; pair<string::const_iterator, string::const_iterator> f(const string &s) { return make_pair(s.begin(), s.end()); }
Функциональные объявления использования:
std::pair<std::string::const_iterator, std::string::const_iterator> f(const std::string &s) { using std::make_pair; return make_pair(s.begin(), s.end()); }
Функция локальная
using namespace
:std::pair<std::string::const_iterator, std::string::const_iterator> f(const std::string &s) { using namespace std; return make_pair(s.begin(), s.end()); }
Что-то другое?
Это предполагает pre-C ++ 14 и, таким образом, не использует возврат типа возврата auto
.
::std::
противstd::
хотя.std
без второго, хотя. Кто-то, определяющий пространство имен std, напрашивается на неприятности (и, вероятно, ищет преимущества, которые использует большинство людей,std
а не нет::std
).Ответы:
Избегайте использования
using
в заголовках, потому что это нарушает назначение пространств имен.Можно использовать его в исходных файлах, но в некоторых случаях я бы все же избегал его (например
using std
).Однако, если у вас есть вложенные пространства имен, все в порядке:
источник
using
ключевое слово без подробного объяснения того, почему пространства имен используются для начала.using std::cout
и друзья, но это не так, какcout
это уже ужасно длинное имя.Когда вы помещаете оператор использования в исходный файл, ПОЖАЛУЙСТА, просто извлеките то, что вам нужно. Например:
Проблема в том, что если вы делаете
вы вводите КАЖДУЮ ОДНУ ВЕЩЬ из std в глобальное пространство имен. Что приводит к очень интересным сообщениям об ошибках, когда вы случайно используете имя в вашем коде, совпадающее с тем, которое вы совершенно не знали в std. Если вы просто добавите то, что хотите, то у вас не будет этой проблемы (или, точнее, у следующего программиста, работающего над вашим кодом, такой проблемы не будет).
источник
using namespace
просто в области действия функции, избегая проблемы.Как указывает VJovic, не используйте
using
в заголовочном файле.using
в заголовочном файле влияет на текущий модуль компиляции (файл .cpp) таким образом, чего исходный файл может не ожидать.using namespace
также следует избегать в исходном файле. Это приводит каждый символ в ту же область, что и исходный файл. Читателям станет понятнее, что вы делаете, если используете определенные символы из пространства имен.источник
using namespace JoystickModule
в начале файла .cpp, а неJoystickModule::
прикреплять его к каждому объекту.using
утверждение для моего собственного пространства имен, над которым я сейчас работаю, а все остальное остается пространством имен.using SomeNameSpace::SomeSymbol
, Это позволяет избежать перемещения каждого символа из пространства имен в текущую область.Запись
using
в заголовках - лучший способ создавать всевозможные неприятные и невозможные отладки ошибок. Вы не делать этого.Запись
using namespace XYZ
в исходном файле немного лучше, но все же может вызвать у вас бесчисленные головные боли. Безопасный способ - явно указать, что вы используете, напримерusing Foo::Bar
.Допустим, у вас есть Bar.cpp со следующим:
Функция работала нормально, пока в один прекрасный день - казалось бы, без каких-либо изменений кода в соответствующих классах - ее поведение изменилось: внезапно
currentIndex
всегда кажется, что один выключен . При просмотре последних изменений вы не обнаружите никаких изменений, даже отдаленно связанных с кодом.В конце концов вы обнаружите причину:
вы (косвенно) включаете
Foo.h
куда-то. В файлах для пространства имен Foo была добавлена новая функция:Что однозначно лучше подходит для
increment(int)
вашей функции,increment(double)
так что теперьFoo::increment()
функция вызываетсяBar::someFunction()
вместо. Упс.(И если бы вы писали
using
в заголовках, которыеusing namespace Foo
вполне могли бы быть где угодно в вашем дереве включения ...)Итак ... Не пишите ничего
using
в Заголовки, а также будьте осторожны с записьюusing namespace
в исходных файлах.источник