Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как проверить вычисленную переменную в #if
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
-AZ-
Как проверить вычисленную переменную в #if c целью вывода #warning
Например:

#define X round((F32_t)11.2)
#if (unsigned int)X>10
#warning X больше 10
#endif

Ошибки:
Error[Pe059]: function call is not allowed in a constant expression
Error[Pe031]: expression must have integral type


Kакие решениия есть?
Спасибо.
zltigo
QUOTE (phenixs @ Jun 12 2016, 12:11) *
Как проверить вычисленную....

У Вас нет вычисления константы препроцессором вот и весь ответ.
-AZ-
Цитата(zltigo @ Jun 12 2016, 12:24) *
У Вас нет вычисления КОНСТАНТЫ препроцессором вот и весь ответ.


Не уловил, предварительно значение определенно, а дальше фик...

Если в define это не получается, то как в функции после проверки переменной тормознуть компиляцию и выдать warning?
Genadi Zawidowski
В подобных случаях я делаю так:
Код
if (sizeof (struct config) > 512)
{
   void ERROR_config_too_large(void);
   ERROR_config_too_large();
   for (;;)
     ;
}
Владивольт
http://electronix.ru/forum/index.php?showtopic=80886&hl=
-AZ-
Цитата(Genadi Zawidowski @ Jun 12 2016, 14:55) *
В подобных случаях я делаю так:
Код
if (sizeof (struct config) > 512)
{
   void ERROR_config_too_large(void);
   ERROR_config_too_large();
   for (;;)
    ;
}


Так у меня не структура а одно значение..., но примерно понял

Цитата(phenixs @ Jun 12 2016, 15:13) *
Так у меня не структура а одно значение..., но примерно понял


Не... с одним значением не понимаю до конца
Genadi Zawidowski
Просто сравните две константы... Нормальный компилятор выкинет обращение к несуществующей функции при нормальном значении и вывалится с ошибкой на линковке при нарушении условий.
KRS
А
static_assert
не подходит?
-AZ-
Цитата(KRS @ Jun 12 2016, 16:05) *
А
static_assert
не подходит?


никак её не приделаю к одному значению...
jcxz
Цитата(phenixs @ Jun 12 2016, 15:11) *
Kакие решениия есть?

Выражение в #if должно быть вычисляемым препроцессором, а он не знает что такое "unsigned int" и "(F32_t)" и, вероятно, что такое "round()".
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.