реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Условная компиляция в макросе C/C++
Ivan_Kov
сообщение Mar 21 2008, 07:40
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 174
Регистрация: 30-10-06
Из: г. Курск
Пользователь №: 21 787



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

#define macroc(a)\
#if(a>0) \
<....> \
#else \
<....> \
#endif

только на этот код компилятор ругается
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Mar 21 2008, 07:53
Сообщение #2


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(Ivan_Kov @ Mar 21 2008, 10:40) *
Хочу написать макрос так, чтобы в зависимости от его аргументов, менялось его содержимое.
Ну что-то типа такого:

#define macroc(a)\
#if(a>0) \
<....> \
#else \
<....> \
#endif

только на этот код компилятор ругается

а зачем решётки перед if и else? в этом случае а должно быть определено до компиляции и не может быть переменной


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
Ivan_Kov
сообщение Mar 21 2008, 08:16
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 174
Регистрация: 30-10-06
Из: г. Курск
Пользователь №: 21 787



Цитата(MrYuran @ Mar 21 2008, 10:53) *
а зачем решётки перед if и else? в этом случае а должно быть определено до компиляции и не может быть переменной

Да, 'a' - константа, и не может быть переменной.
"if" в исполняемом коде - не нужен. препроцессор должен вставить требуемый код.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Mar 21 2008, 08:23
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Ivan_Kov @ Mar 21 2008, 11:16) *
препроцессор должен вставить требуемый код.

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


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Mar 21 2008, 08:27
Сообщение #5


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



а что компилер говорит?
может, после macroc(a) пробел поставить?


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
Ivan_Kov
сообщение Mar 21 2008, 09:01
Сообщение #6


Частый гость
**

Группа: Свой
Сообщений: 174
Регистрация: 30-10-06
Из: г. Курск
Пользователь №: 21 787



Цитата(zltigo @ Mar 21 2008, 11:23) *
Пишите более сложные макросы, или как сказали в рассчете на то, что оптимизатор выкинет.

Не совсем понял вашу мысль,
можно поподробнее?

Цитата(MrYuran @ Mar 21 2008, 11:27) *
а что компилер говорит?
может, после macroc(a) пробел поставить?

говорит: `#' operator should be followed by a macro argument name
к сожалению, пробелы тут не причем...
Go to the top of the page
 
+Quote Post
zltigo
сообщение Mar 21 2008, 09:34
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Ivan_Kov @ Mar 21 2008, 12:01) *
Не совсем понял вашу мысль,

Сделайте, так, как MrYuran советовал и посмотрите на результат (warnings - давить). Только это на крайний случай.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
axle
сообщение Mar 21 2008, 09:35
Сообщение #8


Частый гость
**

Группа: Новичок
Сообщений: 81
Регистрация: 19-04-07
Пользователь №: 27 167



Цитата(Ivan_Kov @ Mar 21 2008, 15:01) *
говорит: `#' operator should be followed by a macro argument name
к сожалению, пробелы тут не причем...

Вы пытаетесь создать вложеный макрос. Препроцессор С это не поддерживает. И пробел не поможет.
Если внутри вашего макроса код, то можно использовать inline функцию. Нормальный компилятор должен оптимизировать.
Код
static inline void func(int a)
{
    if(a > 0) {}
    else {}
}


Сообщение отредактировал axle - Mar 21 2008, 09:35
Go to the top of the page
 
+Quote Post
Ivan_Kov
сообщение Mar 21 2008, 11:16
Сообщение #9


Частый гость
**

Группа: Свой
Сообщений: 174
Регистрация: 30-10-06
Из: г. Курск
Пользователь №: 21 787



Цитата(axle @ Mar 21 2008, 12:35) *
Вы пытаетесь создать вложеный макрос. Препроцессор С это не поддерживает. И пробел не поможет.
Если внутри вашего макроса код, то можно использовать inline функцию. Нормальный компилятор должен оптимизировать.

Спасибо, так и есть
Go to the top of the page
 
+Quote Post
WiseAlex
сообщение Mar 28 2008, 08:27
Сообщение #10


Участник
*

Группа: Новичок
Сообщений: 36
Регистрация: 9-11-06
Пользователь №: 22 115



boost::preprocessor::if
подробнее о библиотеке
там и if и все остальное тоже есть
выдергивается из общей библиотеки та часть которая нужно и в путь

Сообщение отредактировал WiseAlex - Mar 28 2008, 08:29
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 11th July 2025 - 08:19
Рейтинг@Mail.ru


Страница сгенерированна за 0.01434 секунд с 7
ELECTRONIX ©2004-2016