С++: Должен ли я использовать 'typedef' или 'using namespace'?
Я пишу библиотеку с несколькими зависимыми модулями. Когда я включаю файл из другого модуля, я должен разрешить пространство имен с помощью:
using namespace project1::namespace1;
class1 obj;
или
typedef project1::namespace1::class1 class1;
class1 obj;
Каковы плюсы и минусы каждого подхода? Я где-то читал, что мы должны использовать typedef
в файлах .H и using
в файлах .C, это желательно?
Одна из проблем, с которой я столкнулся с "typedef", приводит к неопределенности пространств имен, если я включаю как оригинальный класс, так и класс с "typedef" в третий модуль.
Ответы
Ответ 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;
...
}