所以,我一直在尝试减少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 name
和function template "std::endl" is not a type name
错误消息,一切都很好。
现在,如果我要用typedef
替换所有#define
,则该问题最初似乎已经解决,但是随后,在包含这些定义之一的每一行中,我都会遇到许多语法错误。 (此外,我知道#define
和using namespace std
同样存在问题,因此我也尽量避免出现这种情况)
使问题更复杂的是,第一行(在同一区块中)是这里有问题的两行之一,与我在网上的许多资料来源中看到的完全相同,因此我不知道什么是对的...
如何正确定义数据类型?
提前感谢。
首先,std::cout
不是类型,而是对象。因此,使用
typedef std::cout std_cout;
将不起作用。
使用
typedef std::string std_string;
是合法的。但是,我有以下担忧。
当代码阅读者看到std_string
时,他们会想知道这是什么意思,因此必须追踪其定义。与使用std::string
相比,这是不必要的时间浪费。
std_string
的使用在键入时仅节省一个字符。创建代码所需的时间节省不了多少。
您将无法阻止团队中的其他人使用std::string
。如果两者都存在于代码库中,那就太糟糕了。
但是我仍然不喜欢在整个范围内使用范围运算符时代码的外观,我遇到的一个建议是使用
typedef
来自定义外观。>这是不好的建议,恕我直言。
我的建议:
不用理会typedef
。只需使用完全限定的名称。它使代码更具可读性和可维护性。