Итак, это мой код:
// 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, синтаксическая ошибка: «)»]
Спасибо, что помогли мне Алекс
Кажется, что он работает нормально при компиляции с 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__)
Для справки — я понимаю, что ваше решение «не делай этого», но я все же хотел дать ответ на оригинальный вопрос.
На самом деле, я на самом деле ничего не вижу неправильно с вашим кодом. Это на самом деле работает нормально, если вы скомпилируете его с базовым тестовым примером:
// 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
от компиляции этого — возможно, это приведет к ошибке с более строгими флагами компиляции, хотя!