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

 
 
 
Reply to this topicStart new topic
> ASSERT
demiurg_spb
сообщение Aug 19 2008, 12:24
Сообщение #1


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Есть-ли какая-нибудь возможность сотворить макрос типа ASSERT,
чтобы в случае невыполнения условия вылезал error или warning на этапе компиляции?
Код
#define X 123U
ASSERT(X<10);

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


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
ReAl
сообщение Aug 19 2008, 12:32
Сообщение #2


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



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

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

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

#if X < 10
#error "kwa!"
#endif


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Aug 19 2008, 12:57
Сообщение #3


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Я так и понялcrying.gif


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
VIII_electronix
сообщение Aug 27 2008, 16:17
Сообщение #4





Группа: Новичок
Сообщений: 2
Регистрация: 6-08-08
Пользователь №: 39 454



Цитата(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);

Сообщение отредактировал VIII_electronix - Aug 27 2008, 16:18
Go to the top of the page
 
+Quote Post
amw
сообщение Aug 27 2008, 19:35
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 601
Регистрация: 22-09-05
Из: Kharkov
Пользователь №: 8 847



Цитата(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


--------------------
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть.
© Lewis Carroll. Alice's adventures in wonderland.
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Aug 27 2008, 19:59
Сообщение #6


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

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Не помню, где-то вычитал. Есть такая изящная штука, именуемая 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
Go to the top of the page
 
+Quote Post
VIII_electronix
сообщение Aug 28 2008, 06:05
Сообщение #7





Группа: Новичок
Сообщений: 2
Регистрация: 6-08-08
Пользователь №: 39 454



Цитата(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);
Go to the top of the page
 
+Quote Post
amw
сообщение Aug 28 2008, 10:54
Сообщение #8


Знающий
****

Группа: Свой
Сообщений: 601
Регистрация: 22-09-05
Из: Kharkov
Пользователь №: 8 847



Цитата(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);

Да это работает. Спасибо!


--------------------
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть.
© Lewis Carroll. Alice's adventures in wonderland.
Go to the top of the page
 
+Quote Post
Боинг749
сообщение Aug 29 2008, 18:50
Сообщение #9


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

Группа: Новичок
Сообщений: 83
Регистрация: 25-08-08
Пользователь №: 39 801



Дык в AVR Studio для тех кто пишет на ассемблере есть спец. директивы: .ERROR и .WARNING
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 18:46
Рейтинг@Mail.ru


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