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

时间:2013-02-02 12:33:01

标签: c++ visual-c++ macros static-libraries

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

示例:

class userclass : public lib::superclass<userclass>
{}

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

#define SUPER(x) public lib::superclass<x>
#define SUPERCLASS(x) class x : public lib::superclass<x>

用户现在可以输入。

class userclass : SUPER(userclass)
{}

SUPERCLASS(userclass)
{}

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

可以/我应该:

  1. 有办法保留命名空间要求,但仍然默认为公共派生吗?
  2. 原样使用宏。
  3. 只需要用户写出完整的“public lib :: superclass”。
  4. 我正在使用vs 11,该库是针对Windows开发人员的。

3 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:2)

输入真的不是很多。我已经看到了很多不应该缩短的线条。用宏隐藏它只会混淆你的代码。如果我快速查看你的SUPERCLASS(userclass) {},我几乎可以猜测它是一个类(我不喜欢使用基于猜测的库)但是我不知道它是否被调用它userclass(或两者都没有)或者它正在使用什么样的继承。这意味着你必须记录它,并强迫人们在需要时查找它。

所以正确答案是选项3 - 不要使用宏。

如果你真的真的需要在你的库中使用一个宏,那么给它一个特定于库的前缀。这就像你得到命名空间宏一样接近。

答案 2 :(得分:0)

我投票支持3.只需要用户写出完整的“public lib :: superclass”。

如果符合以下条件,库中的宏可能会非常有用:

  • 写真的很多,
  • 必须多次写一些东西
  • 或者您想隐藏一个丑陋的实现细节,而且该语言不允许您这样做。

但在你的情况下:

  • 没有那么多写,
  • 是的,你必须把类名放两次,
  • 你不想隐藏你是子类的事实,甚至你是在写一个类!

我不认为班级名称的重复 - 一个积极的一点 - 是值得的。特别是因为你会隐藏class关键字并引起读者的一些混淆。

无论如何,如果库使用宏,通常会将库名放在所有宏的前面:

#define MY_FANCY_LIBRARY_NAME_SUPER(x) public lib::superclass<x>

但是现在你没有节省那么多打字......

PS:记住编程的黄金法则:

  

代码只写一次但永远读,因此它应该易于阅读,而不是易于编写。