Re: Хитрая система #define'ов.
От: DmitryShm Россия https://ipshmykov.ru/
Дата: 30.05.10 01:25
Оценка: 6 (3)
Здравствуйте, Аноним, Вы писали:

А>Есть ли более стабильное/правильное решение?


Есть правильное решение не пользоваться макросами, а, исходя из постановки исходной задачи, нормально запрограммировать на С++. Ведь отлаживать макросовую жижу будет не очень приятно.
Хитрая система #define'ов.
От: Аноним  
Дата: 28.05.10 13:44
Оценка:
Здравствуйте, друзья!

Возникла необходимость в такой странной вещи:
Есть некие "объекты", которые однозначно задаются как, скажем, тройка (или четверка, или пара и т.д.) целых КОНСТАНТ, определить их надо в заголовочном файле. Трудность в том, что с этими "объектами" надо работать двумя способами:

— из некоей внешней программы — она читает заголовочный файл и как-то их использует, отсюда и define'ы;
— в компилируемой программе на C++ "компоненты" этих "объектов" должны быть доступны как константы, которые, скажем, могут использоваться в директиве #if.

Другими словами, нужно что-то вроде этого:

#define THREE(x,y,x) x,y,z

#define FIRST_OF_THREE(x,y,z) x
#define SECOND_OF_THREE(x,y,z) y
#define THIRD_OF_THREE(x,y,z) z

#define FIRST(a) FIRST_OF_THREE(a)
#define SECOND(a) SECOND_OF_THREE(a)
#define THIRD(a) THIRD_OF_THREE(a)



Тогда заголовочный файл определения "объектов" будет примерно таким:

#define MyThree THREE(1,2,3)
#define OtherThree THREE(4,5,6)
#define AnotherThree THREE(7,8,9)


А в компилируемом коде я хочу использовать это примерно так:

int k=SECOND(OtherThree); // k=5


Беда в том, что это не везде работает. Это работает в gcc4.3, но не работает в vc2008

Есть ли более стабильное/правильное решение?
Re: Хитрая система #define'ов.
От: Acteon  
Дата: 28.05.10 13:52
Оценка:
Немного не то, но может подкинет идеи: http://www.boost.org/doc/libs/1_43_0/libs/preprocessor/doc/index.html
Re: Хитрая система #define'ов.
От: Vain Россия google.ru
Дата: 28.05.10 14:08
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, друзья!

А>Есть ли более стабильное/правильное решение?
Под 2005 вроде работает:
#define THREE(x,y,z) x,y,z

#define FIRST_OF_THREE(x,y,z) x
#define SECOND_OF_THREE(x,y,z) y
#define THIRD_OF_THREE(x,y,z) z

#define _E(x) x

#define FIRST(a) _E(FIRST_OF_THREE) _E((a))
#define SECOND(a) _E(SECOND_OF_THREE) _E((a))
#define THIRD(a) _E(THIRD_OF_THREE) _E((a))

#define MyThree THREE(1,2,3)
#define OtherThree THREE(4,5,6)
#define AnotherThree THREE(7,8,9)

int k=SECOND(OtherThree); // k=5
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[2]: Хитрая система #define'ов.
От: Axc  
Дата: 31.05.10 09:23
Оценка:
Здравствуйте, DmitryShm, Вы писали:

DS>правильное решение не пользоваться макросами


Я сейчас ещё пончик под коф^W^W^W про goto что-нить спрошу.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.