Я использую объявление using в C ++, чтобы добавить std :: string и std :: vector в локальное пространство имен (чтобы не вводить ненужные символы std ::).
using std::string;
using std::vector;
class Foo { /*...*/ };
Каков объем этого объявления? Если я сделаю это в заголовке, будет ли он вставлять эти объявления using в каждый файл cpp, который включает заголовок?
using
объявление (илиusing
директиву) в область файла во включаемый файл / заголовок! Это вызовет головную боль у пользователей шапки.using
декларацию (подавно директиву ) в заголовке вообще , даже в пространстве имен! См. Объем использования объявления в пространстве имен для проблем, которые это вызывает.using
в области класса и функции безопасно в отношении обсуждаемой проблемы.Ответы:
Когда вы #include заголовочный файл в C ++, он помещает все содержимое заголовочного файла в то место, которое вы включили в исходный файл. Таким образом, включение файла с
using
объявлением имеет тот же эффект, что и размещениеusing
объявления в верхней части каждого файла, который включает этот файл заголовка.источник
using
объявление внутри,namespace
оно ограничено областью этого пространства имен, поэтому в целом это нормально (с обычными оговорками в отношении ваших конкретных потребностей и стиля).В файлах заголовков нет ничего особенного, что могло бы скрыть
using
объявление. Это простая подстановка текста еще до начала компиляции.Вы можете ограничить
using
объявление областью:источник
using
внутри функции (или дажеTEST
макроса gtest !) Делает мою жизнь намного лучше!Объем оператора using зависит от того, где он находится в коде:
источник
using
оператор в рамках класса ...? Из-за этого у меня был тот же вопрос, что и у OP, так как я не хотел печататьstd::
повсюду. У меня есть классы, которые используют много векторов с умными указателями, а пятисимвольныйstd::
префикс добавляет большую длину строки, что, как мне кажется, читается хуже. Поэтому мне было интересно, в порядке лиusing
директива в пространстве имен, содержащем класс? (Даже если в заголовке.)namespace { ... }
?Область видимости - это та область, в которой находится объявление using.
Если это глобальная область видимости, то она будет глобальной. Если он находится в глобальной области действия файла заголовка, то он будет в глобальной области действия каждого исходного файла, который включает заголовок.
Итак, общий совет - избегать использования объявлений в глобальной области заголовочных файлов .
источник
В указанном случае - файл («единица перевода»), что означает «да», каждый файл, который ее включает.
Вы также можете поместить оператор using внутри класса, и в этом случае он действует только для этого класса.
Как правило, если вам нужно указать пространство имен в заголовке, часто лучше просто полностью указать каждый необходимый идентификатор.
источник
using
объявление в классе не ведет себя так же, как за пределами класса - например, вы не можете использовать его для переносаcout
вместоstd::cout
в область действия класса.Это верно. Область видимости - это модуль, который использует
using
объявление. Если какие-либо файлы заголовков, которые включает модуль, имеютusing
объявления, областью этих объявлений будет этот модуль, а также любые другие модули, которые включают те же заголовки.источник
Есть несколько довольно некорректных комментариев, когда они говорят «Не делайте этого». Это слишком сурово, но нужно понимать, когда это нормально.
Писать
using std::string
никогда не бывает нормально. Записьusing ImplementationDetail::Foo
в свой собственный заголовок, когда этот заголовок объявляет ImplementationDetail :: Foo, может быть в порядке, тем более, если объявление using происходит в вашем пространстве имен. Напримеристочник
MyNS::Foo
using boost::posix_time::ptime
. Конечно, пользователь мог писать,MyNS::ptime
но это еще не конец света, и это может быть компенсировано удобством наличия таких функций, какMyFunction(ptime a, ptime b)
.using std::string
никогда не нормально? Даже в вашем собственном пространстве имен, чтобы сохранить многоstd::
префиксов?