是否可以自定义C++?

Le *_*tax 8 c++

对于我的项目,我通常为unsigned int,char和double以及std :: string等类型定义了很多别名.

我也别名和和/,或||,而不是!等.

  • 这被认为是不好的做法还是可以的?

Ign*_*ams 22

定义类型以在代码中添加上下文是可以接受的,甚至是鼓励的.与操作员一起拧紧只会鼓励下一个必须维护密码的人带枪到你家.

  • 提醒我以下引用:"总是编码好像维护你的代码的人是一个疯狂的连环杀手,知道你住在哪里":) (10认同)

Vla*_*lad 11

好吧,考虑习惯于C++的新手.他们在维护您的项目时会遇到困难.

请注意,更有效的别名有很多可能性.一个很好的例子是复杂的嵌套STL容器.

例:

typedef int ClientID;
typedef double Price;
typedef map<ClientID, map<Date, Price> > ClientPurchases;
Run Code Online (Sandbox Code Playgroud)

现在,而不是

map<int, map<Date, double> >::iterator it = clientPurchases.find(clientId);
Run Code Online (Sandbox Code Playgroud)

你可以写

ClientPurchases::iterator it = clientPurchases.find(clientId);
Run Code Online (Sandbox Code Playgroud)

这看起来更清晰可读.


Pis*_*3.0 10

如果你只是用它来无意义地重命名语言功能(而不是@Vlad给出的例子),那么它就是错误的东西.

它肯定会使代码的可读性降低 - 任何精通C++的人都会看到(x ? y : z)并知道它是一个三元条件运算符.虽然ORLY x YARLY y NOWAI z KTHX 可能是同样的事情,它会混淆观众:"这是YARLY NOWAI完全一样的东西? :,更名为作者的便利性,还是有细微的差别?" 如果这些"别名"与标准语言元素相同,那么它们只会减慢下一个人的速度来维护代码.

TLDR:阅读代码,任何代码都很难,无需一直查找私有备用语法.

  • @Ciscol:nitpick:它实际上是一个预处理标记(解析为`&&`),而不是关键字.;-) (2认同)

Kon*_*lph 5

那太糟了.请不要这样做.写出惯用的C++,而不是一些宏观的怪物.一般来说,定义这样的宏是非常糟糕的做法,除非在非常特殊的情况下(例如BOOST_FOREACH宏).

也就是说,and,ornot实际上已经为有效的别名&&,||!在C++!

如果您首先包含标准标头,Visual Studio只知道它们<ciso646>.其他编译器不需要这个.

类型是别的东西.typedef如果它增强了代码的表现力,则使用根据上下文创建类型别名是有意义的.然后鼓励它.但是,更好的方法是创建自己的类型而不是别名.例如,我无法想象创建别名是否有益std::string- 为什么不直接使用std::string?(例外当然是通用数据结构和算法.)