ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Пятница
19 апреля
1168408
Argon (27.01.2022 10:30, просмотров: 2390)
Знатоки Protothreads (и заодно C), нужна помощь, ибо наткнулся на странное поведение препроцессора, выражающееся в обрушении пресловутой машины Даффа :) 

Суть вот в чем: мне надо макрос PT_YIELD(pt) засунуть в свой макрос. Проблема выражается в том, что по какой-то причине более одного раза это сделать невозможно - компилятор XC8 начинает ругаться на лишние case.

Пример.

Мой макрос:

#define DOUBLE_YIELD \

dummy(); \

PT_YIELD(pt);\

dummy(); \

PT_YIELD(pt);\

dummy();


Вставлено в протопотоке:

DOUBLE_YIELD;

Соответственно, не работает.

Если в из макроса выбросить один из PT_YIELD:

#define DOUBLE_YIELD \

dummy(); \

PT_YIELD(pt);\

dummy(); \

dummy();


то компилируется без проблем.
Также проблем нет, если прямо в протопотоке написать содержимое макроса с любым количеством PT_YIELD(pt)

Создается такое ощущение, что это не особенность устройства PT, а какие-то особенности обработки препроцессора. Пока не могу сообразить.

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