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;
...
}