DEFINE Macro是否适用于所有平台?

时间:2010-06-19 16:57:47

标签: c++ visual-c++

我是一个新手,我正在努力改善自己的良好实践和设计,所以在阅读以下内容之前请考虑这一点。

我正在创建一个单例类,我有很多静态成员。而不是像这样每次都给成员打电话......

THECLASS::member

我正在考虑使用define宏来缩短它。

#define(THECLASS::member, shortMember);

所以我的问题是,这会对跨平台还是交叉编译器造成伤害。

6 个答案:

答案 0 :(得分:7)

实际上,您的定义无法在任何地方使用。它应该是:

#define shortMember THECLASS::member

一个好的做法是不尝试保存击键 - 可读性更重要,阅读代码的人希望看到THECLASS ::成员,而不是shortMember,因为他知道在哪里寻找定义。

答案 1 :(得分:6)

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

#define shortMember THECLASS::member

但是,不要这样做

  • 所有宏都在一个命名空间中,并且替换发生在任何地方,因此您最终会遇到巨大的维护问题。

  • 这会损害代码的可读性和可理解性,因为它会使名称来自以及它们引用的内容变得更加困难

在这种情况下,良好的做法是在您使用它的任何地方拼出名称。

答案 2 :(得分:1)

如果您的班级由所有静态方法组成,您可以改为声明namespace  使用这些方法,然后当你想使用.cpp文件中的方法时,请在文件的顶部包含:

using namespace [your-namespace];

只是不要在头文件中执行此操作,否则您将污染包含此标头的所有其他文件的命名空间。

答案 3 :(得分:1)

最有可能,但是你打开自己的命名空间冲突,首先应该避免让类避免,所以它可能不是一个好主意。

答案 4 :(得分:0)

定义可行,但不是你在问题中写的定义。有点像:

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

#define SINGIMPL SingletonImpl::getInstance()

然后可以像这样使用:

SINGIMPL->whatever();

但请记住,宏只是进行文本替换,因此会忽略名称空间等内容。

答案 5 :(得分:0)

要回答标题中的问题,是的,正确编写的DEFINE将适用于所有平台。然而,正如其他人所说,由于引用的原因,这对你的目的不是一个好主意。