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

 
 
 
Reply to this topicStart new topic
> Как проверить вычисленную переменную в #if
-AZ-
сообщение Jun 12 2016, 09:11
Сообщение #1


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

Группа: Участник
Сообщений: 85
Регистрация: 20-09-15
Пользователь №: 88 488



Как проверить вычисленную переменную в #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акие решениия есть?
Спасибо.

Сообщение отредактировал phenixs - Jun 12 2016, 09:23
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jun 12 2016, 09:24
Сообщение #2


Гуру
******

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



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

У Вас нет вычисления константы препроцессором вот и весь ответ.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
-AZ-
сообщение Jun 12 2016, 09:28
Сообщение #3


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

Группа: Участник
Сообщений: 85
Регистрация: 20-09-15
Пользователь №: 88 488



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


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

Если в define это не получается, то как в функции после проверки переменной тормознуть компиляцию и выдать warning?

Сообщение отредактировал phenixs - Jun 12 2016, 09:33
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Jun 12 2016, 11:55
Сообщение #4


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



В подобных случаях я делаю так:
Код
if (sizeof (struct config) > 512)
{
   void ERROR_config_too_large(void);
   ERROR_config_too_large();
   for (;;)
     ;
}


Сообщение отредактировал Genadi Zawidowski - Jun 12 2016, 11:56
Go to the top of the page
 
+Quote Post
Владивольт
сообщение Jun 12 2016, 12:09
Сообщение #5


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

Группа: Участник
Сообщений: 168
Регистрация: 14-02-10
Пользователь №: 55 490



http://electronix.ru/forum/index.php?showtopic=80886&hl=


--------------------
#define TRUE (4==(2*2))
Go to the top of the page
 
+Quote Post
-AZ-
сообщение Jun 12 2016, 12:15
Сообщение #6


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

Группа: Участник
Сообщений: 85
Регистрация: 20-09-15
Пользователь №: 88 488



Цитата(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) *
Так у меня не структура а одно значение..., но примерно понял


Не... с одним значением не понимаю до конца
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Jun 12 2016, 12:23
Сообщение #7


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



Просто сравните две константы... Нормальный компилятор выкинет обращение к несуществующей функции при нормальном значении и вывалится с ошибкой на линковке при нарушении условий.
Go to the top of the page
 
+Quote Post
KRS
сообщение Jun 12 2016, 13:05
Сообщение #8


Профессионал
*****

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



А
static_assert
не подходит?
Go to the top of the page
 
+Quote Post
-AZ-
сообщение Jun 12 2016, 13:08
Сообщение #9


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

Группа: Участник
Сообщений: 85
Регистрация: 20-09-15
Пользователь №: 88 488



Цитата(KRS @ Jun 12 2016, 16:05) *
А
static_assert
не подходит?


никак её не приделаю к одному значению...
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jun 12 2016, 17:18
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(phenixs @ Jun 12 2016, 15:11) *
Kакие решениия есть?

Выражение в #if должно быть вычисляемым препроцессором, а он не знает что такое "unsigned int" и "(F32_t)" и, вероятно, что такое "round()".
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 16th June 2024 - 20:39
Рейтинг@Mail.ru


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