对于我的项目,我通常为诸如unsigned int、char和double以及std::string等类型定义许多别名。
我还将and别名为&&,or别名为||,not别名为!等等。
- 这种做法是否被认为是不好的实践还是可以接受的?
对于我的项目,我通常为诸如unsigned int、char和double以及std::string等类型定义许多别名。
我还将and别名为&&,or别名为||,not别名为!等等。
定义类型以在代码中添加上下文是可以接受甚至是鼓励的。 瞎折腾运算符只会鼓励下一个需要维护你的代码的人带枪到你家。
考虑一下那些习惯于使用C++的新手,他们在维护你的项目时可能会遇到困难。
请注意,有许多更有效的别名可能性。一个很好的例子是复杂的嵌套STL容器。
例子:
typedef int ClientID;
typedef double Price;
typedef map<ClientID, map<Date, Price> > ClientPurchases;
现在,不再使用
map<int, map<Date, double> >::iterator it = clientPurchases.find(clientId);
你可以写
ClientPurchases::iterator it = clientPurchases.find(clientId);
这似乎更清晰易读。
and
已经是一个关键字 :D - CiscoIPPhone&&
),而不是关键字。;-) - Konrad Rudolph"and"、 "or"、"not" 是可以使用的,因为它们是语言的一部分,但是最好按照其他 C++ 程序员的写法来编写 C++ 代码,很少有人会使用它们。不要给它们进行别名定义:它们是保留名称,在预处理器中使用保留名称通常是无效的。如果您的编译器在其默认模式下没有提供它们(即不符合标准),您可以使用 #define
来虚拟它们,但是如果您更改编译器或更改编译器选项,未来可能会遇到麻烦。
对于内置类型而言,使用 typedefs 在某些情况下可能是有意义的。例如,在 C99 (但不适用于 C++03) 中,存在扩展整数类型,如 int32_t
,它指定了一个 32 位整数,在特定系统上可能是 int
的一个 typedef。它们来自于 stdint.h
(<cstdint>
在 C++0x 中),如果你的 C++ 编译器不提供它作为扩展,你可以通常找到或编写一个可以在你的系统上工作的版本。如果您有某些目的,未来可能需要使用不同的整数类型 (也许是在不同的系统上),那么请使用描述您选择该类型用于此目的的重要属性的名称来隐藏 "真实" 类型。如果你只是认为 "int" 太短了,应该改成 "integer",那么你并没有真正帮助任何人,甚至连你自己也没有帮助,因为这样做只是一种徒劳的尝试去修改 C++ 语言中表面的东西。它只是增加了额外的间接性而没有什么好处,在长远来看,更好的做法是学习 C++,而不是试图去修改 C++ 以使其变得更有“意义”。
除非在类似扩展整数类型的情况下,我想不出使用任何其他名称来替代 string
的好理由,其中您的名称可能会是某些构建的 string
的 typedef,而在另一些构建中则是 wstring
。
如果您不是以英语为母语的人,并且正在尝试将 C++ “翻译”成其他语言,那么我可以理解您的观点,但我认为这不是个好主意。即使是您所选择的翻译,其他说您的语言的人也会比您更熟悉 C++。但我是以英语为母语的人,所以我真的不知道这是否有多大的差异。考虑到全世界有多少 C++ 程序员并没有翻译语言,我怀疑这与所有文档都是用英语编写相比,不是一个很大的问题...
begin
别名为{
,将end
或fin
别名为}
,并将ever
别名为(;;)
或(true)
了? - FrustratedWithFormsDesignerand
和or
这两个"替代标记",因此您无需自己实现。 虽然要在MSVC++中支持它们,您可能需要使用/Za
选项(这通常会带来很多问题),或包含iso646.h
头文件。 但是,大多数评论认为,对于大多数程序员来说,使用符号运算符更易读且更可取。 - Michael Burr