什么是最好的“类型重命名”方法?

3
如果我想将std::string类型重命名为更简单、更自然的string,那么以下两种方法哪种更好(基于性能和通常标准)?
我应该将其重命名为预处理指令。
#define string std::string

或者使用类型定义来完成此操作。
typedef std::string string;

什么是最高效的方法?同时,什么更加常见并被社区认可?

2
如果你想将 std::string 重命名为 string,请在你的代码开头写上 using std::string - undefined
不管你怎么做 - 性能都不会受到影响。除非你在谈论编译时间的性能 ;) - undefined
谢谢大家的快速回答,我在这方面还是个菜鸟。 - undefined
定义(#define)可能导致编译器和链接器错误,特别是在库中使用时会出现有趣的错误。 - user2249683
#define string std::string 这样的写法会让人捧腹大笑,被房间里的人嘲笑出去。 - undefined
@M.M 你为什么这么悲催啊,哈哈。 - undefined
3个回答

16

只是

using std::string;
如果您想要一个略微不同的名称,例如:
using String = std::string;
避免使用宏,因为它们不尊重作用域并且通常是邪恶的™。
例如,提议中的宏:
#define string std::string

…如果您包含任何标准库头文件,使用宏定义名称将产生正式的未定义行为,因为它定义了标准库使用的名称。

C++11 §17.6.4.2.2/1 [macro.names]:

包含标准库头文件的翻译单元不得 #define#undef 标准库头文件中声明的名称。


关于不鼓励使用宏的那一部分。 - undefined
谢谢!我添加了一些更多的信息。;-) - undefined
那个 §17.6.4.2.2/1 是一个很好的理由,不要定义任何小写字母开头的变量(带下划线或不带)+1。 - user2249683
加一:尤其是关于未定义行为的那一部分。 - undefined

5
写作
using std::string;

使用using语句是最好的方法。这样可以将标准C++库的字符串类带入当前命名空间。

但是,你真正应该学会流畅地阅读包含作用域解析运算符的代码。在编写代码时,

std::string

熟悉编程的人可以清楚地了解你的代码在做什么。


我知道在一些编码规范中,写命名空间限定符,特别是std::,已经被采纳。许多来自这些公司/项目的程序员声称,在适应了一段时间后,他们发现使用限定符更容易阅读代码。然而,由于需要更多的编写和阅读以及解析(这些都需要时间),而且现代IDE会告诉你任何东西的定义,我怀疑这种做法会浪费很多宝贵的程序员时间。 - undefined
1
@Cheersandhth.-Alf,鉴于80%的开发人员时间都花在代码维护上,我认为明确地使用 std:: 所花费的额外时间与项目的整体成本相比微不足道。 - undefined
2
@RSahu:嗯,80%是我的(未提及的)论点,只是我得出了相反的结论:我认为在编写可读性强且清晰的代码上花费的时间会在维护过程中一次又一次地得到回报。 - undefined
2
@Cheersandhth.-Alf,因人而异。我发现在std::前缀下更易读。 - undefined

4
如果您只想省略命名空间,那么应该使用using
using std::string;

既然它们都是编译时的,因此两种方式都不会更有效率。

对于更复杂的情况,您可以使用其他形式的using

using short_name = complex_name<possibly, with, templates>;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接