Понимание примера TOTW 153 с преобразованием пространства имен - PullRequest
1 голос
/ 15 января 2020

В TOTW 153 утверждается, что использование пространства имен в области действия может утечь в глобальной области, другими словами, они утверждают, что это:

namespace totw {
namespace example {
namespace {

TEST(MyTest, UsesUsingDirectives) {
  using namespace ::testing;
  Sequence seq;  // ::testing::Sequence
  WallTimer timer;  // ::WallTimer

}

}  // namespace
}  // namespace example
}  // namespace totw

примерно эквивалентно:

using ::testing::Expectation;
using ::testing::Sequence;
using ::testing::UnorderedElementsAre;
...
// many, many more symbols are injected into the global namespace

namespace totw {
namespace example {
namespace {

TEST(MyTest, UsesUsingDirectives) {
  Sequence seq; // ::testing::Sequence
  WallTimer timer; // ::WallTimer
  ...
}

} // namespace
} // namespace example
} // namespace totw

Поэтому я ожидал, что если я сделаю это, он скомпилирует:

#include <gtest/gtest.h>
#include <gmock/gmock.h>
namespace totw {
namespace example {
namespace {

TEST(MyTest, UsesUsingDirectives) {
  using namespace ::testing;
  Sequence seq;  // ::testing::Sequence

}

}  // namespace
}  // namespace example
}  // namespace totw

Sequence s; //notice no testing::

Это не . Поэтому мне интересно, ошибаюсь ли я в репликации этого примера, или пример TOTW153 вводит в заблуждение?

Мое лучшее предположение состоит в том, что их пример "неверен" в том смысле, что то, что они утверждают, примерно эквивалентно, на самом деле не эквивалентно в некотором смысле, я бы предположил, что это так.

1 Ответ

4 голосов
/ 15 января 2020

Вы правы в том, что "переданный" код может заставить думать, что ваш последний фрагмент должен работать. Но это не то, что они имели в виду.

Использование ::testing::Expectation et c. добавляются в глобальное пространство имен с точки зрения TEST scope . Другими словами, переданный код фактически идентичен исходному только в пределах TEST области действия . За пределами этой области нет никакого эффекта, но проблемы, которые они перечисляют, остаются проблемами (если только вы не знаете, что ни содержимое области TEST, ни содержимое каких-либо задействованных пространств имен никогда не изменятся). Другими словами, using вводит потенциальные коллизии между всеми (нынешними и будущими ) символами в этой области TEST и символами (нынешними и будущими ) во всех задействованных пространствах имен , Звучит менее страшно, но все равно будет кусать вас в долгосрочной перспективе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...