Подтвердить что ты не робот

С++: Должен ли я использовать 'typedef' или 'using namespace'?

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

using namespace project1::namespace1;
class1 obj;

или

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

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

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

4b9b3361

Ответ 1

Два указанных вами параметра не являются эквивалентными. Это:

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

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

Ответ 2

Вы никогда не должны использовать using или typedef в файле заголовка только для упрощения ввода имен.

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

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

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

Ответ 3

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

Ответ 4

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

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

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

    class1 obj;

    ...
}