C++ 何时使用#define vs typedef?
所以,我一直在尝试减少使用命名空间stdC++ 何时使用#define vs typedef?,c++,namespaces,typedef,C++,Namespaces,Typedef,所以,我一直在尝试减少使用命名空间std的次数,因为我现在多少了解了它会在代码中引起什么冲突,尽管我不会很快使用其他人的代码,但我想训练自己使用好的实践 但我仍然不喜欢在代码上到处散布范围运算符时代码的外观,我遇到的一个建议是使用typedefs来定制一些东西的外观,我写的是: #include <iostream> #include <fstream> #include <string> typedef std::cout std_cout; typede
的次数,因为我现在多少了解了它会在代码中引起什么冲突,尽管我不会很快使用其他人的代码,但我想训练自己使用好的实践
但我仍然不喜欢在代码上到处散布范围运算符时代码的外观,我遇到的一个建议是使用typedefs
来定制一些东西的外观,我写的是:
#include <iostream>
#include <fstream>
#include <string>
typedef std::cout std_cout;
typedef std::endl std_endl;
typedef std::string std_string;
typedef std::fstream std_fstream;
typedef std::ios std_ios;
#包括
#包括
#包括
typedef std::cout std_cout;
typedef std::endl std_endl;
typedef std::string std_string;
typedef std::fstream std_fstream;
typedef std::ios std_ios;
现在,当我键入这个时,除了前两行(在第二个代码块中)之外,一切都很好,这两行分别给出了变量“std::cout”不是类型名
和函数模板“std::endl”不是类型名
错误消息
现在,如果我将所有的typedef
s替换为#define
s,问题一开始看起来已经解决了,但是在包含其中一个定义的每一行中,我都会出现大量语法错误。(此外,我知道#define
与使用名称空间std
同样存在问题,所以我也在努力避免这种情况)
让事情更复杂的是,第一行(在同一块中),这是两个有问题的行中的一行,与我在网上的许多来源中看到的一行完全相同,所以我不知道什么是正确的
如何正确定义数据类型
提前感谢。首先,std::cout
不是类型,而是对象。因此,使用
typedef std::cout std_cout;
这是行不通的
使用
typedef std::string std_string;
这是合法的。然而,我有以下关切
当代码的读者看到std_string
时,他们会想知道它是什么意思,并且必须追踪它的定义。与使用std::string
相比,这是不必要的时间浪费
使用std_string
键入时只保存一个字符。创建代码所需的时间并没有节省多少
您将无法阻止团队中的其他人使用std::string
。如果两者都存在于代码库中,那就太糟糕了
但我仍然不喜欢将作用域操作符洒在代码上时代码的外观,我遇到的一个建议是使用typedef
s来定制事情的外观
这是个糟糕的建议,伊姆霍
我的建议:不要麻烦使用typedef
s。只需使用完全限定的名称。它使代码更具可读性和可维护性。为什么要这样做?只使用<代码> STD::CUT >其他C++程序员可以读取代码。发明自己的方言对任何人都没有帮助,也一事无成。std::
前缀的存在是有原因的,两者都是为了将std
名称空间从代码中分离出来,但是人们可以查找文档,而不必费解像std\u cout
这样奇怪的东西到底是什么。提示:typedef
用于类型,而std::cout
不是类型。您可以定义一个全局变量,如auto&std\u cout=std::cout
,但这是一条不应该走下去的路。一个选项是习惯于看到std::
,顾名思义,typedef
定义类型。它不用于制作预处理器宏或别名。这就是#define
的目的。另外,管他的代码是C++还是你想自己的语言?在这种情况下,不需要一个TyBufff而不是一个宏(并且,对于<代码> CUT和 EntL< /COD> >代码> TyPulf 是错误的,因为它们不是类型)。所需要的只是一个using声明using std::cout
,或者(如果您不想编写一系列声明)一个using指令,例如using namespace std
。不管你怎么做,这都需要权衡(例如,如果有其他同名的名称空间)。实际上,最好习惯于阅读和键入std::
并完全限定名称/