何时使用#define与typedef?

问题描述 投票:0回答:1

所以,我一直在尝试减少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错误消息,一切都很好。

现在,如果我要用typedef替换所有#define,则该问题最初似乎已经解决,但是随后,在包含这些定义之一的每一行中,我都会遇到许多语法错误。 (此外,我知道#defineusing namespace std同样存在问题,因此我也尽量避免出现这种情况)

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

如何正确定义数据类型?

提前感谢。

c++ namespaces typedef
1个回答
2
投票

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

typedef std::cout std_cout;

将不起作用。

使用

typedef std::string std_string;

是合法的。但是,我有以下担忧。

  1. 当代码阅读者看到std_string时,他们会想知道这是什么意思,因此必须追踪其定义。与使用std::string相比,这是不必要的时间浪费。

  2. std_string的使用在键入时仅节省一个字符。创建代码所需的时间节省不了多少。

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

但是我仍然不喜欢在整个范围内使用范围运算符时代码的外观,我遇到的一个建议是使用typedef来自定义外观。>

这是不好的建议,恕我直言。

我的建议:

不用理会typedef。只需使用完全限定的名称。它使代码更具可读性和可维护性。
© www.soinside.com 2019 - 2024. All rights reserved.