有没有一种方法可以用#define替换长命名空间?

3
假设我有一个非常长的命名空间,我不想一直打它。但是我也不想使用 using namespace ...。我能用 #define 来实现吗?
示例:
#define glm::quat glm::gtc::quaternion

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

我不想使用"using",因为glm::部分也会消失,我认为。所以我想保留glm部分,但不要完全长的gtc::quaternion部分。 当我现在尝试这样做时,我得到以下错误:

错误1 错误C2008:宏定义中意外的“:”

2个回答

13

你不需要使用define,可以使用命名空间别名:

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

或者如果你想要别名真正存在于glm命名空间中,就把它放在那里:

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

1
@DaVince:glm 命名空间不是我的,所以那永远不会起作用,但我不知道关于别名的事情。我能在 using namespace 中使用这个语句吗? - Marnix
@Mamix:是的,你可以在using namespace中使用它,因此即使命名空间不属于你,也没有问题。 DaVince唯一错误的是这是命名空间重命名而不是命名空间别名。 - gnobal
@gnobal:这个代码:using namespace glm_quat = glm::gtc::quaternion; 不能正常工作。我得到了编译器错误。 - Marnix
1
@Mamix:你需要先声明别名(不使用),然后使用“using”。别忘了在四元数后加上::quat。 - MestreLion
这是命名空间别名,可以参考标准中的[7.3.2]。只要不是std命名空间,你应该被允许扩展glm命名空间(我不能百分之百确定,但在短时间内我没有找到任何禁止它的标准)。 我从未听说过使用using指令进行命名空间别名,但我也不知道为什么你需要它(或者它应该做什么)。 - DaVinci

2

在 #DEFINE(“名称”部分)的左侧不能使用“:”字符。但在右侧(“值”)允许使用。

因此,请尝试以下操作:

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

class Camera
{
protected:
    GLM_QUAT m_mRotation;
};

请记住,#DEFINE只是一种预编译宏,在“名称值”对形式中。左侧与变量名具有相同的规则,右侧可以是任何内容。它只是编译器在进行任何编译/语法检查之前替换您代码中的文本。
顺便说一句,我强烈建议您在#DEFINE名称中使用大写字母,这样您就可以轻松地在代码中找到它们,避免调试代码时出现许多混淆。您不想将其误读为变量或类型。大写字母有助于使它清晰明了地被您视为宏。

不知道这一点!谢谢。但现在我看到了命名空间别名,我认为那会更适合我,并且作为一个答案更具体。你觉得在using namespace中也能做到这一点吗? - Marnix
1
是的,作为一个 #DEFINE 只是文本替换,你可以在任何地方使用它。替换发生在进行任何编译之前。因此,实际处理的代码与您键入整个“glm::gtc::quaternion::quat”相同。这只是编译器为您执行的文本替换。 - MestreLion

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接