Цитата(prottoss @ Mar 2 2008, 17:28)

Хотя я не помню, чтоб пользовался вычислениями в параметре макросов, скобки обязательно нужны.
Насколько я помню, при макроподстановке с аргументами наличие скобок обязательно, и на это обращают внимание все авторы. Вот, посмотрел в Кернигана и Ричи:
Цитата
4.11.2 Макроподстановка.
....следует позаботиться о скобках, чтобы обеспечить нужный порядок вычислений. Задумайтесь, что случится, если при определении
#define square(x) x*x /* НЕВЕРНО */
вызвать square (z+1)
Цитата(prottoss @ Mar 2 2008, 17:28)

Думаю, вот так будет правильно
#define LOBYTE(word) ((UINT8)word)
#define LOWORD(dword) ((UINT16)dword)
Все-таки не до конца

Здесь Вы скобки почему-то снова опустили. Вот пример

:
Код
UINT16 var = 0x55AA;
UINT8 test(void) {
return LOBYTE(var >> 4);
}