Есть ли способ заменить длинные пространства имен на #define? - PullRequest
3 голосов
/ 20 февраля 2011

Предположим, у меня очень длинное пространство имен, которое я не хочу вводить постоянно.Но я тоже не хочу использовать using namespace ....Могу ли я использовать #define для этого?

Пример:

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

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

Я не хочу использовать использование, потому что, как мне кажется, glm :: part также исчезнет.Поэтому я бы хотел оставить часть glm, но не полностью длинную часть gtc :: quaternion.Когда я пытаюсь сделать это сейчас, я получаю следующую ошибку:

Ошибка 1 Ошибка C2008: ':': неожиданно в определении макроса

Ответы [ 2 ]

13 голосов
/ 20 февраля 2011

вам не нужно определение, используйте псевдоним пространства имен:

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

или, если вы хотите, чтобы псевдоним действительно находился в пространстве имен glm, поместите его там:

namespace glm {
  namespace quat = gtc::quaternion::quat;
}
2 голосов
/ 20 февраля 2011

Вы не можете использовать символ ":" в левой части #DEFINE (часть "name"). Но это разрешено в правой части («значение»)

Итак, попробуйте это:

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

class Camera
{
protected:
    GLM_QUAT m_mRotation;
};

Помните, что #DEFINE - это просто макрос предварительной компиляции в форме пары "имя-значение". Левая часть имеет те же правила, что и имя переменной, а правая часть может быть любой. Это просто текст, который компилятор заменяет в вашем коде перед любой проверкой компиляции / синтаксиса.

Кстати, я настоятельно предлагаю вам использовать UPPER_CAPS в ваших именах #DEFINE, чтобы вы могли легко обнаружить их в своем коде, что позволяет избежать путаницы при отладке кода. Вы НЕ хотите неправильно понимать его как переменную или тип. Заглавные буквы помогают вам понять, что это макрос.

...