C++ 何时使用#define vs typedef?

C++ 何时使用#define vs typedef?,c++,namespaces,typedef,C++,Namespaces,Typedef,所以,我一直在尝试减少使用命名空间std的次数,因为我现在多少了解了它会在代码中引起什么冲突,尽管我不会很快使用其他人的代码,但我想训练自己使用好的实践 但我仍然不喜欢在代码上到处散布范围运算符时代码的外观,我遇到的一个建议是使用typedefs来定制一些东西的外观,我写的是: #include <iostream> #include <fstream> #include <string> typedef std::cout std_cout; typede

所以,我一直在尝试减少使用命名空间std
的次数,因为我现在多少了解了它会在代码中引起什么冲突,尽管我不会很快使用其他人的代码,但我想训练自己使用好的实践

但我仍然不喜欢在代码上到处散布范围运算符时代码的外观,我遇到的一个建议是使用
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::
    并完全限定名称/