2010-06-19 95 views
0

我是一个新手,我想在良好的实践和设计中让自己更好,所以在阅读以下内容之前先考虑一下。DEFINE宏在所有平台上工作?

我正在创建一个单例类,并且我有很多静态成员。而不是每次像这样调用成员...

THECLASS::member 

我在考虑使用一个定义的宏来缩短它。

#define(THECLASS::member, shortMember); 

所以我的问题是,这会损害跨平台或交叉编译器。

+4

除了下面的评论,你应该考虑[根本不使用单例模式](http://jalf.dk/blog/2010/03/singletons-solving-problems-you-didnt-know-you-从未有-因为-1995 /)。 – 2010-06-19 17:05:41

回答

7

实际上,您的定义不会在任何地方工作。它应该是:

#define shortMember THECLASS::member 

和良好的做法是不试图挽救按键–可读性更重要的是,和别人读你的代码,希望看到theClass描述::成员,而不是shortMember,因为那时他知道在哪里寻找一个定义。

+3

+1可读性更重要。你只能输入一段代码(比喻),但它会被读取很多次,而不仅仅是你自己。 – ChrisF 2010-06-19 17:02:38

+0

你有shortMember和THECLASS :: member交换。编辑:我看你已经修好了。 – 2010-06-19 17:06:14

+0

我认为这是一个很好的观点。 – numerical25 2010-06-19 17:15:12

1

如果你的类是由所有的静态方法,你可以改为声明namespace 与方法,那么当你要使用的方法.cpp文件,包括文件的顶部:

using namespace [your-namespace]; 

只是不要在头文件中这样做,否则会污染包含此头的所有其他文件的名称空间。

1

最有可能的,但是你打开了自己的名字空间冲突,有阶级本来应该避免的,所以它可能不是一个好主意。

6

您将需要使用正确的语法的宏定义:

#define shortMember THECLASS::member 

然而,不这样做

  • 所有的宏都在一个命名空间中,并且替换发生在任何地方,所以最终会导致巨大的维护头痛。

  • 这伤害了代码的可读性和可理解性,因为它使得它变得更加困难,这里的名字来自于和他们指

在这种情况下,比较好的做法是拼写出了名的地方你用吧。

0

定义将起作用,但不是您在问题中写入的定义。沿着线的东西:

class SingletonImpl { 
... 
SingletonImpl *getInstance() { return m_instance; } 
} 

#define SINGIMPL SingletonImpl::getInstance() 

然后可以这样使用:

SINGIMPL->whatever(); 

但是请记住,宏只是做文本替换,因此忽略之类的命名空间。

0

要回答标题中的问题,是的,正确书写的DEFINE可以在所有平台上使用。然而,正如其他人所说,由于所列举的原因,这对您的目的不是一个好主意。

相关问题