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

 
 
> build-time проверка условия
jcxz
сообщение Aug 31 2015, 06:02
Сообщение #1


Гуру
******

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



В своих проектах беру себе за правило чтобы, если имеются какие-то дефайны, задающие некоторые условия компиляции, то где-то была проверка на допустимость значений этих дефайнов и, если они вне допустимых пределов, проект не собирался бы.
Например: имеется некий дефайн, задающий кол-во элементов массива N (размер элемента L), этот массив передаётся через некий интерфейс, размер кадра которого ограничен некоей величиной M.
В этом случае я добавляю проверку, чтобы: N*L <= M.
Если все величины известны на этапе препроцессора, всё ок - делаю: #if/#error/#endif
Но если контролируемое выражение нельзя рассчитать на этапе препроцессора (например: L=sizeof(...)), то приходится писать что-то вроде:
enum {CheckExp = 1 / ((N*L > M) ? 0: 1)};
в расчёте на ошибку "деление на ноль" при компиляции.
Работает конечно, но может есть более элегантное решение?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
SSerge
сообщение Aug 31 2015, 08:13
Сообщение #2


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

Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528



Можно ещё сослаться на несуществующую глобальную переменную или функцию.
Тогда на этапе сборки линкер её не найдёт и выдаст сообщение.


--------------------
Russia est omnis divisa in partes octo.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Aug 31 2015, 09:23
Сообщение #3


Гуру
******

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



Цитата(SSerge @ Aug 31 2015, 14:13) *
Можно ещё сослаться на несуществующую глобальную переменную или функцию.
Тогда на этапе сборки линкер её не найдёт и выдаст сообщение.

Как? Приведите пример

Цитата(CrimsonPig @ Aug 31 2015, 14:44) *
Ну, я давным-давно сделал себе макрос и таскаю его между всеми своими проектами:
#define __ASSERT_COMPILE(x) void __compile_time_assert(int __check[(x)?1:-1])

Ну это примерно то же, что и у меня.

Цитата(Kabdim @ Aug 31 2015, 13:48) *
В С11(gcc-4.6+) есть _Static_assert/static_assert().
http://en.cppreference.com/w/c/language/_Static_assert

У меня IAR или CCS. sad.gif
Go to the top of the page
 
+Quote Post



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

 


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


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