何时使用预处理程序指令在C ++中定义函数?

时间:2015-05-05 08:09:56

标签: c++ preprocessor-directive

我发现了一段代码如下。

#define READWRITE READWIRTE
#define READWIRTE(varType, varName, funName)                \
private: varType varName;                                    \
public: varType get##funName(void) const { return varName; }\
public: void set##funName(varType var){ varName = var; }

READWIRTE(int, mSessionId, SessionId)

我想知道为什么不以正常形式定义函数。我的意思是,像这样:

private:
  int mSessionId;
public:
  public int getSessionId() const;
  public void setSessionId(int sessionId); 

然后定义这两个函数。

我应该何时使用预处理程序指令?

5 个答案:

答案 0 :(得分:2)

这个宏将确保每个变量都正确定义了它的setter和getter。

这将有助于您的开发人员认为每次编写变量,getter和setter都是浪费时间的情况。他可以简单地称这个宏。这对于进行代码审查的人来说会更容易,因为如果你想要setter和getter,他/她会知道会发生什么(在这种情况下它会是宏)。

答案 1 :(得分:2)

如@ user258367所说,这个宏可以帮助你用public getter和setter声明私有字段。

如果您拥有大量的那些并且没有为您执行低级编码的IDE,那么它可以是一个选项,因为:

READWIRTE(int, mSessionId, SessionId)

比完整代码更简洁。

但除非它是企业环境中的常见用法,并且包含在许多项目中共享的.h中,否则我不会使用它:

  • 首先写字段,后来getter和setter似乎是一种更常见的用法
  • 它鼓励总是有getter和setter,即使有一个是useles(但你可能还有其他的READONLY和WRITEONLY宏)
  • 它会在public:可见性中隐含地让您感到困惑

    private:
        int foo; // private, no need for getter or setter
        READWIRTE(int, mSessionId, SessionId);
        double bar; // is public !
    
    public:
        void othermethod(); 
        ...
    

答案 2 :(得分:1)

这似乎是一个用于生成"属性的宏#34;在课堂上。作者最有可能将其用作快捷方式,而不是手动输入私有成员/访问者/变种人。

答案 3 :(得分:1)

我认为使用宏有两个很好的理由:

  • 就像这里一样,作为避免繁琐输入的简写;

  • 当你不想在额外的函数中包装非可移植的构造(函数调用)时,确保代码在不同平台或代码的不同变体之间的可移植性。

答案 4 :(得分:1)

代码看起来旨在为用户提供简单地向类添加属性的简写。乍一看,它似乎是防止不必要打字的有用捷径。但是,由于以下原因,简单地在成员函数中添加getter和setter可能并不总是最好的路径。

  1. 在这种情况下,由于函数只是简单地设置或返回值,因此几乎没有添加公共成员变量的任何值。
  2. 很可能不需要这两个功能中的一个。例如,如果使用RAII,则在对象构造中设置该值,可能不需要添加setter或实际上不需要。
  3. 它可能根本不支持大型对象或以有效方式支持。
  4. 它不会(以当前形式)是线程安全的。
  5. 除非使用它的代码也被生成或使用类似的宏,否则这些函数调用将在某些时候由客户端代码调用,因此必须在那里手动编码getter和setter(即使它们不是不严格出现在标题中)......
  6. ...在查看定义的源代码时,调试会更加困难,例如setSessionId()在任何地方都找不到它。
  7. 尽管可以通过宏实现此目的,但使用宏的normal warnings适用。在结束这条路线之前,结论是要三思而后行。