Mar*_*lle 5 c++ macros coding-style
我的设置模块有一些冗余代码:
#include <QSettings>
class MySettings
{
public:
// param1
void setParam1(QString param1) { _settings.setValue("param1", param1); }
string param1() { return _settings.value("param1").toString(); }
// param2
void setParam2(int param2) { _settings.setValue("param2", param2); }
int param2() { _settings.value("param2").toInt(); }
// param3
void setParam3(int param3) { _settings.setValue("param3", param3); }
int param3() { _settings.value("param3").toInt(); }
private:
QSettings _settings;
}
Run Code Online (Sandbox Code Playgroud)
我设法通过使用宏减少了要编写的代码量。以下是QString参数类型的示例:
#define INTSETTING(setter, getter) \
void set##setter(QString getter) { settings.setValue(#getter, getter);} \
QString getter() {return settings.value(#getter).toString();}
Run Code Online (Sandbox Code Playgroud)
因为我使用的是 C++,所以我知道宏的使用是不好的。我正在寻找更清洁的替代品。
我给出了一个 Qt 示例(QString),但这是一个更一般的问题。
宏使上述类的定义更加简单:
class MySettings
{
public:
STRINGSETTING(Param1, param1)
INTSETTING(Param2, param2)
INTSETTING(Param3, param3)
STRINGSETTING(DefaultTitle, defaultTitle)
INTSETTING(MaxDocCount, maxDocCount)
private:
QSettings _settings;
}
Run Code Online (Sandbox Code Playgroud)
您可以以宗教的方式回答这个问题,也可以回到旧原则:如果它使您的代码更具可读性,那就去做。
有很多人以宗教的方式回答这个问题,他们只是讨厌预处理器和与它有关的一切,并禁止在他们的代码中使用它。
另一方面,有些人经常定义宏来完成重复性任务,我已经多次这样做了,最常见的是定义一个宏以供在单个函数中使用(在 GNU 中定义子函数的方式很多) -C)。
我认为,人们对它的看法与人们goto对这句话的看法非常相似:大多数人认为它的用途是非妖魔化的,其他人则认为它有其积极的用途,不应将其视为邪恶。你需要自己决定这个。