Проблема с #define
От: rsn  
Дата: 07.08.02 09:45
Оценка:
Есть большая программа с кучей версий, где номер версии определен примерно как
#define VER "1.0.1"
Надо написать функцию, тело которой меняеться в зависимости от номера версии,
то есть типа
#if VER == "1.0.1"
....//что-то пишем здесь
#else
....//что-то другое пишем здесь
#endif

Как вы понмаете это не компилируеться, так как сравнивать строки в препроцессоре нельзя.

Вариант присвоения переменной номера версии и последующее сравнение не проходит,
потому что некоторые глобалные переменные и функции появились в поздних версиях программы и при компиляции более ранней версии про эти функции ничего не известно...

Как же написать эту функцию, чтобы один раз вставил ее и все скомпилировалось на всех версиях программы?
А то множество тел функций в разные версии вставлять я уже замучился...

Заранее спасибо.
Re: Проблема с #define
От: Bell Россия  
Дата: 07.08.02 09:55
Оценка:
Здравствуйте rsn, Вы писали:

А нельзя заменить
#define VER "1.0.1"

на что-нибудь типа
#define VER 101


Числа в препроцессоре сравниваются на ура, так что можно смело писать

#if VER == 101
...
#else
...
#endif
Любите книгу — источник знаний (с) М.Горький
Re: Проблема с #define
От: PPA Россия http://flylinkdc.blogspot.com/
Дата: 07.08.02 10:02
Оценка:
Здравствуйте rsn, Вы писали:

rsn>Есть большая программа с кучей версий, где номер версии определен примерно как

rsn>#define VER "1.0.1"
rsn>Надо написать функцию, тело которой меняеться в зависимости от номера версии,
rsn>то есть типа
rsn>#if VER == "1.0.1"
rsn>....//что-то пишем здесь
rsn>#else
rsn>....//что-то другое пишем здесь
rsn>#endif

rsn>Как вы понмаете это не компилируеться, так как сравнивать строки в препроцессоре нельзя.


rsn>Вариант присвоения переменной номера версии и последующее сравнение не проходит,

rsn>потому что некоторые глобалные переменные и функции появились в поздних версиях программы и при компиляции более ранней версии про эти функции ничего не известно...

rsn>Как же написать эту функцию, чтобы один раз вставил ее и все скомпилировалось на всех версиях программы?

rsn>А то множество тел функций в разные версии вставлять я уже замучился...

rsn>Заранее спасибо.



Обычно делают так:

#define _RWSTD_VER 0x020101
AABBCC
| | |
| | +-- CC = Maintenance number
| +---- BB = Minor Release number
+------ AA = Major Release number
Re: Проблема с #define
От: Vi2 Удмуртия http://www.adem.ru
Дата: 07.08.02 10:30
Оценка:
Здравствуйте rsn, Вы писали:

rsn>Есть большая программа с кучей версий, где номер версии определен примерно как

rsn>#define VER "1.0.1"
rsn>Надо написать функцию, тело которой меняеться в зависимости от номера версии,
rsn>то есть типа
rsn>#if VER == "1.0.1"
rsn>....//что-то пишем здесь
rsn>#else
rsn>....//что-то другое пишем здесь
rsn>#endif

rsn>Как вы понмаете это не компилируеться, так как сравнивать строки в препроцессоре нельзя.


rsn>Вариант присвоения переменной номера версии и последующее сравнение не проходит,

rsn>потому что некоторые глобалные переменные и функции появились в поздних версиях программы и при компиляции более ранней версии про эти функции ничего не известно...

rsn>Как же написать эту функцию, чтобы один раз вставил ее и все скомпилировалось на всех версиях программы?

rsn>А то множество тел функций в разные версии вставлять я уже замучился...

#define VERMAJOR 1
#define VERMINOR 0
#define VERSUBRELAESE 1

#define QUOTE2(a,b,c) #a "." #b "." #c
#define QUOTE(a,b,c) QUOTE2(a,b,c)

#define VER QUOTE(VERMAJOR,VERMINOR,VERSUBRELAESE)

#if VERMAJOR == 1 && VERMINOR == 0 && VERSUBRELAESE == 1
....//что-то пишем здесь
#else 
....//что-то другое пишем здесь
#endif
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[2]: Проблема с #define
От: rsn  
Дата: 07.08.02 10:38
Оценка:
Здравствуйте Vi2, Вы писали:

Люди!!! Я знаю как сделать проверку версий с нуля ... Но программа изначально написана не мной, и править ее не с руки.. Как обойтись тем что есть (#define VER "1.0.1")?
Re[3]: Проблема с #define
От: Vi2 Удмуртия http://www.adem.ru
Дата: 07.08.02 11:11
Оценка:
Здравствуйте rsn, Вы писали:

rsn>Люди!!! Я знаю как сделать проверку версий с нуля ... Но программа изначально написана не мной, и править ее не с руки.. Как обойтись тем что есть (#define VER "1.0.1")?


Т.е. у тебя есть уже этот макрос. Он определён где-то и ты не хочешь его изменять? А как быть с "большая программа с кучей версий" — как она определяет версии?

Иначе только так
    if( strcmp( VER, "1.0.1" ) == 0 )
    {
        ....//что-то пишем здесь
    }
    else
    {
        ....//что-то другое пишем здесь
    }
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[3]: Проблема с #define
От: Аноним  
Дата: 07.08.02 12:38
Оценка:
Здравствуйте rsn, Вы писали:

rsn>Люди!!! Я знаю как сделать проверку версий с нуля ... Но программа изначально написана не мной, и править ее не с руки.. Как обойтись тем что есть (#define VER "1.0.1")?


Но где-то эта строчка с номером версии задается? Может быть, там подправить? Сделать наоборот: не из строки доставать числа, а из чисел создать строку 'VER', чтобы сохранить совместимость со старым кодом.

#define VER1 1
#define VER2 0
#define VER3 1

#define VER_(x) #x
#define VER__(x, y, z) VER_(x) "." VER_(y) "." VER_(z)
#define VER VER__(VER1, VER2, VER3)


#if VER1 == 1 && VER2 == 0 && VER3 == 1
    //что-то пишем здесь 
#else 
    //что-то другое пишем здесь 
#endif
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.