Условная компиляция

User avatar
Privet
Администратор
Posts: 17204
Joined: 03 Jan 1999 10:01
Location: Redmond, WA

Условная компиляция

Post by Privet »

Как сотворить что-то типа такого, но что работает:

Code: Select all

#if ThisType == char
...
#endif
Привет.
ig
Уже с Приветом
Posts: 491
Joined: 09 Apr 2000 09:01
Location: Tigard, OR

Post by ig »

Code: Select all

#define THISTYPE_IS_CHAR /* if it is true */
...
#if defined THISTYPE_IS_CHAR
...
#endif
User avatar
Privet
Администратор
Posts: 17204
Joined: 03 Jan 1999 10:01
Location: Redmond, WA

Post by Privet »

Как сделать с новой переменной я знаю. У меня таких типов несколько, поэтому я хотел бы работать сразу с типами. Похоже, не получится.
Привет.
Vovka
Уже с Приветом
Posts: 1906
Joined: 14 Mar 2001 10:01

Post by Vovka »

Privet wrote:У меня таких типов несколько, поэтому я хотел бы работать сразу с типами. Похоже, не получится.

Не знаю вашей задачи, но если у вас C++, а не C, то может вместо условной компиляции лучше шаблоны со специализацией использовать?
User avatar
katit
Уже с Приветом
Posts: 23804
Joined: 05 Jul 2003 22:34
Location: Брест -> St. Louis, MO

Post by katit »

Vovka wrote:Не знаю вашей задачи, но если у вас C++, а не C, то может вместо условной компиляции лучше шаблоны со специализацией использовать?


Товарищ не указал на чем это пишется. :pain1:
Но :umnik1: я полагаю что это PHP
Т.к. в компилируемых языках "условнаюа" компиляция проишодит однажды.

В VB например, есть такое:

Code: Select all

If TypeOf(myVar) .... 
Vovka
Уже с Приветом
Posts: 1906
Joined: 14 Mar 2001 10:01

Post by Vovka »

katit wrote:Товарищ не указал на чем это пишется. :pain1:
Но :umnik1: я полагаю что это PHP

Ой. 8O
Как-то даже не подумал. Если честно, до сих пор в голове не укладывается, что кроме Двух Языков люди ещё на чём-то могут программы писать. :mrgreen:
User avatar
A. Fig Lee
Уже с Приветом
Posts: 12072
Joined: 17 Nov 2002 03:41
Location: английская колония

Post by A. Fig Lee »

Мне кажется ето не имеет решения.
Буду рад ошибится.
У меня похожий вопрос:
Когда я делаю билды каждый раз я добавляю какието комментс - что было изменено. Когда я запускаю

Code: Select all

./myprogramm -v

она печатает мои последние комментс, билд, виршн ну и так далее.
Сейчас я все ети комментс также аппендаю в файл - который я хочу назначить
какой нибудь переменной в мое программе, чтоб я когда запустил

Code: Select all

./мyprogramm -H

она печатала типа:

Code: Select all

билд 143: исправил баг с сокетами
билд 145: добавил новый баг
...

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

Code: Select all

#define HISTORY #include myhistory.file
Верить нельзя никому - даже себе. Мне - можно!
User avatar
A. Fig Lee
Уже с Приветом
Posts: 12072
Joined: 17 Nov 2002 03:41
Location: английская колония

Post by A. Fig Lee »

Привет, можно попробовать

Code: Select all

#if sizeof(char) == sizeof(YOUR_TYPE)


:?
Верить нельзя никому - даже себе. Мне - можно!
User avatar
olg2002
Уже с Приветом
Posts: 990
Joined: 27 Mar 2002 10:01
Location: Palo Alto, CA

Post by olg2002 »

Такой вариант требует предописания всех типов, но зато потом можно менять только ThisType и только в одном месте:

Code: Select all

#define char_val        1
#define double_val      2
#define VAL_(x) x##_val
#define VAL(x) VAL_(x)

#if VAL(ThisType) == VAL(char)
ThisType == char
#endif

#if VAL(ThisType) == VAL(double)
ThisType == double
#endif
User avatar
Nervous
Уже с Приветом
Posts: 7759
Joined: 18 Sep 2001 09:01
Location: RUS.76 -> KOR -> RUS.53 -> US.PA -> US.MD

Post by Nervous »

К сожалению, если мы говорим о С\С++, то возможности прекомпилятора достаточно бедны, в частности из-за однопроходности оного. Я же, все, что не удается сделать прекомпилятором, делаю Перл-скриптами. Кстати, этот подход решает проблему остутствия прекомпилятора в Яве....
N.E.R.V.O.U.S.: Networked Electronic Replicant Viable for Observation and Ultimate Sabotage.
Hatih
Уже с Приветом
Posts: 750
Joined: 10 Dec 2003 20:11

Post by Hatih »

Фигли, $Id$ или $Log$ спасет отца русской демократии.
User avatar
A. Fig Lee
Уже с Приветом
Posts: 12072
Joined: 17 Nov 2002 03:41
Location: английская колония

Post by A. Fig Lee »

Hatih wrote:Фигли, $Id$ или $Log$ спасет отца русской демократии.


спасибо, попробуем.
Верить нельзя никому - даже себе. Мне - можно!
Palych
Уже с Приветом
Posts: 13723
Joined: 16 Jan 2001 10:01

Post by Palych »

Hatih wrote:Фигли, $Id$ или $Log$ спасет отца русской демократии.

A interesno, chto krome CVS podderzhivaet etu feature?
Hatih
Уже с Приветом
Posts: 750
Joined: 10 Dec 2003 20:11

Post by Hatih »

Palych wrote: ...
A interesno, chto krome CVS podderzhivaet etu feature? ...


Еще RCS :-) Но вопрос в другом - а что, кроме CVS может использовать джентельмен? А тем более брат-униксоид :mrgreen: ?
User avatar
tarantula
Уже с Приветом
Posts: 285
Joined: 04 Mar 2004 19:37
Location: Край света

Post by tarantula »

Nervous wrote:
К сожалению, если мы говорим о С\С++, то возможности прекомпилятора достаточно бедны, в частности из-за однопроходности оного.


Многопроходность можно эмулировать путем создания project который будет генерировать исходный код в другом проекте:

#if sizeof(CMyType) == sizeof(char)
file_out << "// dummy comment 1"
#else
file_out << "// dummy comment 2"
#endif

Второй project будет dependent на генерирующий project.

Return to “Вопросы и новости IT”