Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: ASSERT
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > GNU/OpenSource средства разработки
demiurg_spb
Есть-ли какая-нибудь возможность сотворить макрос типа ASSERT,
чтобы в случае невыполнения условия вылезал error или warning на этапе компиляции?
Код
#define X 123U
ASSERT(X<10);

У меня такое никак не выходит....
Спасибо!
ReAl
Цитата(demiurg_spb @ Aug 19 2008, 15:24) *
Есть-ли какая-нибудь возможность сотворить макрос типа ASSERT,
чтобы в случае невыполнения условия вылезал error или warning на этапе компиляции?

Нет, внутри макросов другие директивы препроцессора применять нельзя.
А иногда хочется.

Только врукопашную.
Код
#define X 123U

#if X < 10
#error "kwa!"
#endif
demiurg_spb
Я так и понялcrying.gif
VIII_electronix
Цитата(demiurg_spb @ Aug 19 2008, 16:24) *
Есть-ли какая-нибудь возможность сотворить макрос типа ASSERT,
чтобы в случае невыполнения условия вылезал error или warning на этапе компиляции?
Код
#define X 123U
ASSERT(X<10);

У меня такое никак не выходит....
Спасибо!




#define MY_ASSERT_H(a,h) typedef int my_assert_##h##_h [(a) ? 1 : 0]
#define MY_ASSERT(a) MY_ASSERT_H(a,__LINE__)


use:

#define MY_SOME_C 10

MY_ASSERT(MY_SOME_C == 10);
MY_ASSERT(sizeof(int) == 2);
amw
Цитата(VIII_electronix @ Aug 27 2008, 19:17) *
#define MY_ASSERT_H(a,h) typedef int my_assert_##h##_h [(a) ? 1 : 0]
#define MY_ASSERT(a) MY_ASSERT_H(a,__LINE__)
use:

#define MY_SOME_C 10

MY_ASSERT(MY_SOME_C == 10);
MY_ASSERT(sizeof(int) == 2);

Разворачивается препроцессором так
Код
typedef int my_assert___LINE___h[(10 == 10)?1:0];
typedef int my_assert___LINE___h[(sizeof(int) == 2)?1:0];

В результате дважды объявлен тип my_assert___LINE___h
sergeeff
Не помню, где-то вычитал. Есть такая изящная штука, именуемая STATIC_ASSERT. Она именно выдает ошибку на этапе компиляции (обычный ASSERT - на этапе выполнения). Выглядит примитивно, но не тривиально. Два но:
1. катит только на C++
2. на разных компиляторах выдает совершенно различную интерпретацию кода ошибки, но точно показывает строку, где эта ошибка возникает.
Я просто в комментарии к этой строке пишу, что здесь контролируется.

template<bool> struct CompileTimeError;
template<> struct CompileTimeError<true> {};
#define STATIC_ASSERT(expr) \
(CompileTimeError<(expr) != 0>())


// Example of usage:
// STATIC_ASSERT(sizeof(int) > 4); - produce error in ARM or X86 machine
VIII_electronix
Цитата(amw @ Aug 27 2008, 23:35) *
Разворачивается препроцессором так
Код
typedef int my_assert___LINE___h[(10 == 10)?1:0];
typedef int my_assert___LINE___h[(sizeof(int) == 2)?1:0];

В результате дважды объявлен тип my_assert___LINE___h


да, забыл про дополнительный уровень вложенности.
гнутые компиляторы, дополнительно требуют отрицательный размер массива для ошибки.
примерно такой код использовал в keil, icc, gcc, bcb.

#define MY_JOIN_3_H(A,B,C) A##B##C
#define MY_JOIN_3(A,B,C) MY_JOIN_3_H(A,B,C)

#define MY_ASSERT_H(A) typedef int MY_JOIN_3(my_assert_,__LINE__,_h) [(A) ? 1 : -1]
#define MY_ASSERT(A) MY_ASSERT_H(A)

#define MY_SOME_C 10

MY_ASSERT(MY_SOME_C == 10);
MY_ASSERT(sizeof(int) == 2);
amw
Цитата(VIII_electronix @ Aug 28 2008, 09:05) *
да, забыл про дополнительный уровень вложенности.
гнутые компиляторы, дополнительно требуют отрицательный размер массива для ошибки.
примерно такой код использовал в keil, icc, gcc, bcb.

#define MY_JOIN_3_H(A,B,C) A##B##C
#define MY_JOIN_3(A,B,C) MY_JOIN_3_H(A,B,C)

#define MY_ASSERT_H(A) typedef int MY_JOIN_3(my_assert_,__LINE__,_h) [(A) ? 1 : -1]
#define MY_ASSERT(A) MY_ASSERT_H(A)

#define MY_SOME_C 10

MY_ASSERT(MY_SOME_C == 10);
MY_ASSERT(sizeof(int) == 2);

Да это работает. Спасибо!
Боинг749
Дык в AVR Studio для тех кто пишет на ассемблере есть спец. директивы: .ERROR и .WARNING
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.