Почему этот макрос генерирует синтаксическую ошибку?

Итак, это мой код:

// Defines a tuple
#define __WINDOW__RESOLUTION__ 500, 200

// Seperate the tuple
#define __WINDOW__X__1(Width, Height)  (Width)
#define __WINDOW__Y__1(Width, Height)  (Height)

// Add another sort of indirection because my tuple is a macro
#define __WINDOW__X__(Macro) __WINDOW__X__1(Macro)
#define __WINDOW__Y__(Macro) __WINDOW__Y__1(Macro)

// These should be the final values 500 and 200
#define __WINDOW__RESOLUTION__X__ (__WINDOW__X__(__WINDOW__RESOLUTION__))
#define __WINDOW__RESOLUTION__Y__ (__WINDOW__Y__(__WINDOW__RESOLUTION__))

Когда я использую первый макрос, где последнее число должно быть, что-то идет не так:

std::cout << __WINDOW__RESOLUTION__X__ << std::endl; // Outputs 200 instead of 500

над строкой выводится число 200, поэтому значение Y вместо значения X

std::cout << __WINDOW__RESOLUTION__Y__ << std::endl; // ERR with macro underlined

эта строка даже не скомпилируется [C2059, синтаксическая ошибка: «)»]

Спасибо, что помогли мне Алекс

1

Решение

Кажется, что он работает нормально при компиляции с gcc4.9, но проблема может заключаться в том, что потоки компилятора __WINDOW__RESOLUTION__ в качестве одного параметра. Например, если вы замените

#define __WINDOW__RESOLUTION__X__ (__WINDOW__X__(__WINDOW__RESOLUTION__))

с

#define __WINDOW__RESOLUTION__X__ (__WINDOW__X__(500, 200))

Это выдаст ошибку, потому что __WINDOW__X__ ожидает только 1 параметр.

Вы можете решить это с помощью ... а также __VA_ARGS__ в вашем макросе, который будет пересылать любой параметр, который он получает:

#define __WINDOW__X__(...) __WINDOW__X__1(__VA_ARGS__)
#define __WINDOW__Y__(...) __WINDOW__Y__1(__VA_ARGS__)
2

Другие решения

Для справки — я понимаю, что ваше решение «не делай этого», но я все же хотел дать ответ на оригинальный вопрос.

На самом деле, я на самом деле ничего не вижу неправильно с вашим кодом. Это на самом деле работает нормально, если вы скомпилируете его с базовым тестовым примером:

// Defines a tuple
#define __WINDOW__RESOLUTION__ 500, 200

// Seperate the tuple
#define __WINDOW__X__1(Width, Height)  (Width)
#define __WINDOW__Y__1(Width, Height)  (Height)

// Add another sort of indirection because my tuple is a macro
#define __WINDOW__X__(Macro) __WINDOW__X__1(Macro)
#define __WINDOW__Y__(Macro) __WINDOW__Y__1(Macro)

// These should be the final values 500 and 200
#define __WINDOW__RESOLUTION__X__ (__WINDOW__X__(__WINDOW__RESOLUTION__))
#define __WINDOW__RESOLUTION__Y__ (__WINDOW__Y__(__WINDOW__RESOLUTION__))

#include <iostream>
using namespace std;

int main() {
// your code goes here
std::cout << __WINDOW__RESOLUTION__X__ << std::endl;
std::cout << __WINDOW__RESOLUTION__Y__ << std::endl;
return 0;
}

Похоже, что ваша ошибка может быть связана с скобками в вашем последнем macroТем не менее, просто удаление их может решить эту проблему, но опять же — это не требуется для меня (используя gcc 5.4 под ubuntu):

// These should be the final values 500 and 200
#define __WINDOW__RESOLUTION__X__ __WINDOW__X__(__WINDOW__RESOLUTION__)
#define __WINDOW__RESOLUTION__Y__ __WINDOW__Y__(__WINDOW__RESOLUTION__)

Ранее также указывалось, что двойное подчеркивание __ за которым следует заглавная буква, но это, конечно, не остановило gcc от компиляции этого — возможно, это приведет к ошибке с более строгими флагами компиляции, хотя!

1

По вопросам рекламы [email protected]