Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Условная компиляция в макросе C/C++
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Операционные системы > Программирование
Ivan_Kov
Хочу написать макрос так, чтобы в зависимости от его аргументов, менялось его содержимое.
Ну что-то типа такого:

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

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

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

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

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

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

Препроцесор должен делать только то, что он должен делать, а не то, что вдруг без оглядки на систему в данный момент захотелось. Пишите более сложные макросы, или как сказали в рассчете на то, что оптимизатор выкинет.
MrYuran
а что компилер говорит?
может, после macroc(a) пробел поставить?
Ivan_Kov
Цитата(zltigo @ Mar 21 2008, 11:23) *
Пишите более сложные макросы, или как сказали в рассчете на то, что оптимизатор выкинет.

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

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

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

Сделайте, так, как MrYuran советовал и посмотрите на результат (warnings - давить). Только это на крайний случай.
axle
Цитата(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 {}
}
Ivan_Kov
Цитата(axle @ Mar 21 2008, 12:35) *
Вы пытаетесь создать вложеный макрос. Препроцессор С это не поддерживает. И пробел не поможет.
Если внутри вашего макроса код, то можно использовать inline функцию. Нормальный компилятор должен оптимизировать.

Спасибо, так и есть
WiseAlex
boost::preprocessor::if
подробнее о библиотеке
там и if и все остальное тоже есть
выдергивается из общей библиотеки та часть которая нужно и в путь
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.