何时使用#define 与 typedef?

When to use #define vs typedef?

所以,我一直在努力减少 using namespace 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;

现在,当我键入此内容时,一切正常,除了前两行(在第二个代码块中)分别给我 variable "std::cout" is not a type namefunction template "std::endl" is not a type name 错误消息。

现在,如果我用 #defines 替换所有 typedefs,问题最初似乎已经解决,但最终我会在每一行中出现大量语法错误包含这些定义之一。 (此外,我知道 #define 也和 using namespace std 一样有问题,所以我也尽量避免那个问题)

更复杂的是,第一行(在同一块中),这是这里有问题的两行之一,与我在网上的许多资源中看到的完全相同,所以我不知道什么是对的了...

如何正确定义数据类型?

提前致谢。

首先,std::cout不是类型,而是对象。因此,使用

typedef std::cout std_cout;

是行不通的。

使用

typedef std::string std_string;

是合法的。但是,我有以下顾虑。

  1. 当 reader 的代码看到 std_string 时,他们会想知道它的含义并且必须追查它的定义。与使用 std::string.

  2. 相比,这是不必要的时间浪费
  3. 使用 std_string 可以在输入时仅节省一个字符。这并没有节省多少创建代码的时间。

  4. 您无法阻止团队中的其他人使用 std::string。当两者都存在于代码库中时,那就太糟糕了。

But I still don't like the way the code looks when you sprinkle scope operators all over it, one advice I came across is to use typedefs to customize how things looks a bit

恕我直言,这是个糟糕的建议。

我的建议: 不要理会 typedef。只需使用完全限定名称。它使代码更具可读性和可维护性。