提问人:vidit 提问时间:4/26/2012 最后编辑:vidit 更新时间:2/29/2016 访问量:22221
C++:我应该使用“typedef”还是“使用命名空间”?[已结束]
C++: Should I use 'typedef' or 'using namespace'? [closed]
问:
我正在编写一个具有多个依赖模块的库。当我包含来自不同模块的文件时,我是否应该使用以下命令解析命名空间:
using namespace project1::namespace1;
class1 obj;
或
typedef project1::namespace1::class1 class1;
class1 obj;
每种方法的优缺点是什么?我在某处读到我们应该在 .H 文件和 .C文件,这是可取的吗?typedef
using
我在使用“typedef”时遇到的一个问题是,如果我在第三个模块中同时包含原始类和带有“typedef”的类,则会导致命名空间歧义。
答:
最清晰的方法是不使用这些方法中的任何一种 - 只需编写 .new project1::namespace1::class1()
评论
您陈述的两个选项并不等同。这个:
using namespace project1::namespace1;
从命名空间中提取所有内容,几乎无法控制,并且可能会发生冲突。我在这里只看到缺点,没有优点。
但是你不需要使用 a 来引入单个符号,你可以使用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 project1::namespace1::class1
或者,您可以限制在本地范围内使用 namespce,这既是为了方便起见,又不会破坏全局命名空间。
void function()
{
using namespace project1::namespace1;
class1 obj;
...
}
切勿仅仅为了让名称更易于键入而在头文件中使用 OR。using
typedef
在源文件中,由您决定。写出整个名字似乎被认为是很好的做法,因为它可以非常清楚地表达您的意思。如果命名空间太长,可以使用命名空间别名来减少混乱,但仍要保持含义清晰:namespace ns = project1::namespace1;
无论哪种方式,如果要将符号导入全局命名空间,请使用 ,而不是 。 主要用于您想用不同的名称调用类型时,很多时候是因为它是一个模板 - 例如,而不是 ,它仍然很清楚,但类型更好。using
typedef
typedef
my_map
std::map<std::string, my_type>
另外,请参阅以下问题:为什么“使用命名空间 std”被认为是不良做法?
评论
typedef
size_t
ptrdiff_t
评论
using project1::namespace1::class1;