vid*_*vid 39 c++ namespaces using-directives
我正在编写一个包含多个依赖模块的库.当我包含来自不同模块的文件时,我是否应该使用以下命令解析命名空间:
using namespace project1::namespace1;
class1 obj;
Run Code Online (Sandbox Code Playgroud)
要么
typedef project1::namespace1::class1 class1;
class1 obj;
Run Code Online (Sandbox Code Playgroud)
每种方法的优缺点是什么?我读到了我们应该typedef在.H文件和using.C文件中使用的地方,这是可取的吗?
我遇到的'typedef'的一个问题是,如果我在第三个模块中包含原始类和带有'typedef'的类,则会导致名称空间不明确.
jua*_*nza 74
您声明的两个选项不相同.这个:
using namespace project1::namespace1;
Run Code Online (Sandbox Code Playgroud)
从命名空间中提取所有内容,让您几乎无法控制并且可能发生冲突.我只看到缺点,没有专业人士.
但是你不需要使用一个typedef带来单个符号,你可以使用
using project1::namespace1::class1;
Run Code Online (Sandbox Code Playgroud)
无论你使用这个还是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
Run Code Online (Sandbox Code Playgroud)
所以这两个表达式并不完全等价.
小智 10
你不应该使用using或typedef头文件只是为了使名称更容易输入的缘故.
在源文件中,由您决定.写出全名似乎被认为是一种好习惯,因为它非常清楚你的意思.如果您的命名空间太长,您可以使用命名空间别名来减少混乱,但仍然保持清晰的含义:namespace ns = project1::namespace1;
无论哪种方式,如果您要将符号导入全局命名空间,请使用using,而不是typedef.typedef主要用于当你想用不同的名称调用类型时,很多次因为它是一个模板 - 例如,my_map而不是std::map<std::string, my_type>,它仍然是清晰的,但键入更好.
另外,请看这个问题:为什么"使用命名空间std"被认为是不好的做法?
| 归档时间: |
|
| 查看次数: |
14806 次 |
| 最近记录: |