有没有办法用#define替换长命名空间?

时间:2011-02-20 12:15:26

标签: c++ macros namespaces

假设我有一个非常长的命名空间,我不想一直输入。但我也不想使用using namespace ...。我可以使用#define吗?

示例:

#define glm::quat glm::gtc::quaternion

class Camera
{
protected:
    glm::quat m_mRotation;
};

我不想使用use,因为glm :: part也会消失,我想。所以我想保留glm部分,但不是完全长的gtc :: quaternion部分。当我现在尝试这个时,我收到以下错误:

  

错误1错误C2008:':':宏定义中出现意外

2 个答案:

答案 0 :(得分:13)

您不需要定义,使用命名空间别名:

namespace glm_quat = glm::gtc::quaternion::quat;

或者如果你想让别名真的在glm命名空间中,请把它放在那里:

namespace glm {
  namespace quat = gtc::quaternion::quat;
}

答案 1 :(得分:2)

您无法使用#DEFINE左侧的“:”字符(“名称”部分)。但它允许在右侧(“价值”)

所以,试试这个:

#define GLM_QUAT glm::gtc::quaternion::quat

class Camera
{
protected:
    GLM_QUAT m_mRotation;
};

请记住,#DEFINE只是一个预编译宏,采用“名称值”对形式。左侧部分与变量名称具有相同的规则,右侧可以是任何内容。它只是编译器在进行任何编译/ sintax检查之前替换的文本。

顺便说一下,我强烈建议您在#DEFINE名称中使用UPPER_CAPS,这样您就可以在代码中轻松发现它们,这样可以避免在调试代码时产生很多混淆。你不想把它误读为变量或类型。大写有助于让你清楚它是一个宏。