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

 
 
> 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
 
Start new topic
Ответов
VIII_electronix
сообщение Aug 27 2008, 16:17
Сообщение #2





Группа: Новичок
Сообщений: 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
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 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
VIII_electronix
сообщение Aug 28 2008, 06:05
Сообщение #4





Группа: Новичок
Сообщений: 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
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 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
Сообщение #6


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

Группа: Новичок
Сообщений: 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 Текстовая версия Сейчас: 30th July 2025 - 13:10
Рейтинг@Mail.ru


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