Ala*_*ing 7 c++ macros alias function c-preprocessor
假设我Utility在一个文件中有一个类utility.h:
class Utility {
public:
static double longDescriptiveName(double x) { return x + 42; }
};
Run Code Online (Sandbox Code Playgroud)
然后我发现我使用的功能longDescriptiveName(...)很多.就像一个不负责任的C++程序员,当我喝了太多咖啡时,我创建了一个新文件utilitymacros.h并在其中添加以下内容:
#define ldn Utility::longDescriptiveName
Run Code Online (Sandbox Code Playgroud)
现在我把它包括"utilitymacros.h"在*.cpp我使用的任何地方ldn(...),我的心里充满了快乐,因为输入3个字母对28更加方便.
问题:这样做比使用更安全(更合适)#define吗?
我注意到在包含boost标题之后我必须包含"utilitymacros.h",我显然不喜欢它,因为它是冲突的标志(尽管我得到的Boost错误并不是很清楚冲突是什么) .
澄清1:关于代码可读性
如果您可能会说这会对代码可读性产生负面影响,我向您保证不会,因为它是一小部分功能使用很多.被广泛知道的一个例子是stoi对stringToInteger.另一种是pdf对probabilityDensityFunction等,所以如果我要做到以下几点,stoi在我看来更具可读性:
int x = stoi(a) + stoi(b) + stoi(c) + stoi(d);
Run Code Online (Sandbox Code Playgroud)
比:
int x = Utility::stringToInteger(a) + Utility::stringToInteger(b)
+ Utility::stringToInteger(c) + Utility::stringToInteger(d);
Run Code Online (Sandbox Code Playgroud)
要么:
int x = Utility::stringToInteger(a);
x += Utility::stringToInteger(b);
x += Utility::stringToInteger(c);
x += Utility::stringToInteger(d);
Run Code Online (Sandbox Code Playgroud)
澄清2:编辑宏
我使用Emacs作为我的首选IDE和Kinesis键盘,因此你知道我使用了大量的键盘宏,自定义键盘快捷键,以及实际修改我在编辑器中看到的内容与实际存储在h/cpp文件中的内容.但是,我觉得在一些选择的情况下使用函数缩写的简单性和视觉可读性(如上所述)确实是我正在寻找的结果(这肯定受到一定程度的影响).
Naw*_*waz 13
您可以编写inline将调用转发给实际函数的函数,而不是宏:
inline double ldn(double x)
{
return Utility::longDescriptiveName(x);
}
Run Code Online (Sandbox Code Playgroud)
这当然比宏观更安全.
您可以使用函数引用:
double (&ldn)(double) = Utility::longDescriptiveName;
Run Code Online (Sandbox Code Playgroud)