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

 
 
> Опасные определения, приводят к катастрофе!
ivainc1789
сообщение Sep 7 2007, 14:44
Сообщение #1


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

Группа: Свой
Сообщений: 1 175
Регистрация: 5-01-05
Пользователь №: 1 807



В программе есть описания:

#define BIT(x) (1 << (x))
#define SETBIT(x,y) (x |= (1<<y)) // Set bit y in byte x
#define SETBITS(x,y) (x |= (y)) // Set bits y in byte x

Соответственно при написании исходных текстов пользователь может забыть как правильно использовать эти определения и написать примерно так:

SETBIT(TIMSK,TOIE1);
SETBITS(TIMSK,TOIE1+TOIE0);

Очевидно, оба предложения валидны с точки зрения компилятора при использовании стандартных определений битов (через цифры 7...0). Однако второе предложение является ошибочным. Нужно правильно записать так:

SETBITS(TIMSK,BIT(TOIE1)+BIT(TOIE0));

Хотелось бы сделать так, чтобы либо компилятор выдавал сообщение об ошибке, или переписать определение для SETBITS, чтобы оно имело бОльшую "защиту от дурака".
Как это разумнее сделать в IAR EWAVR?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Непомнящий Евген...
сообщение Sep 7 2007, 14:53
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153



Цитата(ivainc1789 @ Sep 7 2007, 18:44) *
#define SETBITS(x,y) (x |= (y)) // Set bits y in byte x


По моему, такой макрос вреден - из его названия совершенно непонятно, как им пользоваться - что писать в y, как именно надо указать нужные биты - через запятую, сложить ...

Лично я пользуюсь макросами вида:
Код
#define BIT(n) (1<<(n))
#define BIT2(b1, b2) (BIT(b1)|BIT(b2))
#define BIT3(b1, b2, b3) (BIT2(b1,b2)|BIT(b3))
#define BIT4(b1, b2, b3, b4) (BIT3(b1,b2,b3)|BIT(b4))
#define BIT5(b1, b2, b3, b4, b5) (BIT4(b1,b2,b3,b4)|BIT(b5))
#define BIT6(b1, b2, b3, b4, b5, b6) (BIT5(b1,b2,b3,b4,b5)|BIT(b6))
#define BIT7(b1, b2, b3, b4, b5, b6, b7) (BIT6(b1,b2,b3,b4,b5,b6)|BIT(b7))

#define SETBIT(p,n) (p)|=BIT(n)


Если вам нужен SETBITS, то насоздавайте кучу макросов SETBIT2 .. 7
Неудобство - надо указывать правильное число. Если укажите неправильное - получите ошибку компиляции. В принципе, не сильно напрягает...
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- ivainc1789   Опасные определения   Sep 7 2007, 14:44
- - zltigo   Цитата(ivainc1789 @ Sep 7 2007, 17:44) SE...   Sep 7 2007, 17:46
|- - ivainc1789   Цитата(zltigo @ Sep 7 2007, 21:46) Будьте...   Sep 7 2007, 18:23
|- - zltigo   Цитата(ivainc1789 @ Sep 7 2007, 21:23) Wa...   Sep 7 2007, 18:48
- - singlskv   Цитата(ivainc1789 @ Sep 7 2007, 18:44) В ...   Sep 7 2007, 19:14
|- - zltigo   Цитата(singlskv @ Sep 7 2007, 22:14) у ...   Sep 7 2007, 19:56
|- - singlskv   Цитата(zltigo @ Sep 7 2007, 23:56) Скобоч...   Sep 7 2007, 20:06
|- - zltigo   Цитата(singlskv @ Sep 7 2007, 23:06) а у ...   Sep 7 2007, 20:15
|- - singlskv   Цитата(zltigo @ Sep 8 2007, 00:15) Тогда ...   Sep 7 2007, 20:19
|- - zltigo   Цитата(singlskv @ Sep 7 2007, 23:19) Поэт...   Sep 7 2007, 20:38
|- - singlskv   Цитата(zltigo @ Sep 8 2007, 00:38) Все ст...   Sep 7 2007, 20:48
|- - zltigo   Цитата(singlskv @ Sep 7 2007, 23:48) 1...   Sep 7 2007, 20:58
|- - singlskv   Цитата(zltigo @ Sep 8 2007, 00:58) Ну это...   Sep 7 2007, 21:19
|- - zltigo   Цитата(singlskv @ Sep 8 2007, 00:19) этот...   Sep 8 2007, 05:47
- - ivainc1789   Мдя... А я уже было думал, что привык... Придется ...   Sep 7 2007, 21:16
- - aaarrr   0xFF, но повод хороший. Не могу не поделиться заме...   Sep 7 2007, 22:08
- - dxp   Цитата(aaarrr @ Sep 8 2007, 05:08) 0xFF, ...   Sep 8 2007, 10:04
- - alexander55   По поводу макросов могу сказать, не ленитесь побол...   Sep 10 2007, 05:47


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

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 09:45
Рейтинг@Mail.ru


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