在制作图书馆时应该避免MACRO

Dav*_*vid 0 c++ macros static-libraries visual-c++

该库提供了一个派生类,派生类作为模板参数.

例:

class userclass : public lib::superclass<userclass>
{}
Run Code Online (Sandbox Code Playgroud)

你可以看到很多东西要打字.并且"userclass"应该始终公开,以使其正常工作.所以我提出了两个看起来像这样的MACRO:

#define SUPER(x) public lib::superclass<x>
#define SUPERCLASS(x) class x : public lib::superclass<x>
Run Code Online (Sandbox Code Playgroud)

用户现在可以键入任何一个.

class userclass : SUPER(userclass)
{}

SUPERCLASS(userclass)
{}
Run Code Online (Sandbox Code Playgroud)

但主要问题是,MACER SUPER和SUPERCLASS存在于用户全局命名空间中,与包含的标题一样快.

可以/我应该:

  1. 有一种方法可以保留命名空间要求,但仍然默认为公共派生?
  2. 按原样使用宏.
  3. 只需要用户写出完整的"public lib :: superclass".

我正在使用vs 11,该库是针对Windows开发人员的.

Pup*_*ppy 6

使用宏的第一条规则是"不要,如果有任何其他解决方案".在这种情况下,还有另一种解决方案,所以摆脱它们.

其次,你的宏弊大于利,因为人们不知道它们只是通过读它扩展到了什么,而完整的定义确实如此.说真的,你节省了真正微不足道的字符数,以便在可读性方面付出真正可怕的代价.它比简单地写出继承要好得多.

  • 我做了很多维护工作.宏观用户处于恐怖分子,贩毒者,虐待儿童和PHP开发者之下的阶梯上. (3认同)