C++: должен ли я использовать 'typedef' или 'using namespace'? [закрытый]

Я пишу библиотеку с зависимыми от mutiple модулями. Когда я включаю файл из другого модуля, должен ли я разрешить пространство имен с помощью:

using namespace project1::namespace1;
class1 obj;

или

typedef project1::namespace1::class1 class1;
class1 obj;

какие плюсы/минусы каждого подхода? Я где-то читал, что надо использовать typedef in .H-файлы и using in .C files, это целесообразно?

одна проблема, с которой я столкнулся с "typedef", - это приводит к неоднозначности пространства имен, если я включаю как исходный класс, так и класс с помощью typedef в третьем модуле.

4 ответов


два параметра, которые вы указываете, не эквивалентны. Этот:

using namespace project1::namespace1;

тянет на все из пространства имен, давая вам мало контроля и делая столкновения вероятными. Я вижу здесь только минусы и никаких плюсов.

но вам не нужно использовать typedef чтобы ввести один символ, вы можете использовать

using project1::namespace1::class1;

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

namespace X {
  const int x{42};
  enum Fruit{Apple, Pear};
}

using X::x; // OK
typedef X::x xx; // Error! 'x' in namespace 'X' does not name a type

таким образом, два выражения не полностью эквивалентны.


вы никогда не должны использовать using или typedef в заголовочном файле просто ради того, чтобы имена легче вводить.

в исходном файле, это зависит от вас. По-видимому, хорошей практикой считается написать полное имя, так как это очень ясно дает понять, что вы имели в виду. Если ваше пространство слишком долго, вы можете использовать псевдоним пространства имен, чтобы уменьшить беспорядок, но смысл ясен: namespace ns = project1::namespace1;

в любом случае, если вы собираетесь импортировать символы в глобальное пространство имен, используйте using, а не typedef. typedef используется, в основном, когда вы хотите позвонить, типа другое имя, много раз, потому что это шаблон - например, my_map вместо std::map<std::string, my_type>, что по-прежнему ясно, но гораздо приятнее печатать.

Также см. Этот вопрос: почему" использование пространства имен std " считается плохой практикой?


самый ясный способ-не использовать ни один из этих методов-просто напишите new project1::namespace1::class1().


использовать using project1::namespace1::class1

или вы можете ограничить использование namespce в локальной области, как для вашего удобства, так и не загрязнять глобальное пространство имен.

void function()
{
    using namespace project1::namespace1;

    class1 obj;

    ...
}