Я искал макрос, который будет похож на конструкцию. Использование должно быть что-то вроде:"with" macro in C
with (lock(&x), unlock(&x)) {
...
}
Это может быть полезно для некоторых других целей.
Я придумал этот макрос:
#define __with(_onenter, _onexit, v) \
for (int __with_uniq##v=1; __with_uniq##v > 0;)\
for (_onenter; __with_uniq##v > 0; _onexit) \
while (__with_uniq##v-- > 0)
#define _with(x, y, z) __with(x, y, z)
#define with(_onenter, _onexit) _with(_onenter, _onexit, __COUNTER__)
Он имеет 3 вложенных циклов, так как он должен:
- Инициализировать счетчик цикла (только C99, конечно)
- Возможно инициализировать переменную _onenter (например,
with (int fd=open(..), close(fd))
) - Разрешить
break
внутри кодового блока. (continue
допускается тоже. А макрос может быть скорректирована, чтобыassert()
его)
Я использовал его на код для xv6 OS и кажется весьма полезным.
Мой вопрос - какие самые худшие проблемы с таким макросом? Я имею в виду, кроме простого использования макроса C (особенно тот, который реализует новую конструкцию потока управления).
До сих пор нашел эти недостатки/проблемы:
- Нет поддержки
return
илиgoto
(но это может сэкономитьgoto
с в коде ядра) - Нет поддержки ошибок (например,
fd < 0
). Я думаю, что это исправление. - gnu89/c99 и выше только (счетчик циклов. Уникальный трюк не нужен)
- Несколько менее эффективный, чем простой замок-разблокировка. Я считаю, что это несущественно.
Есть ли другие проблемы? Есть ли лучший способ реализовать аналогичную конструкцию в C?
Ох. ответ наконец ... Спасибо, я не знал о 'cleanup' - звучит полезно. Есть ли у макроса более специфические проблемы, помимо его скукости? – Elazar
Отсутствие поддержки для 'return' кажется сделкой, если вы не работаете со строгим стандартом кодирования в отношении операторов' return' в середине функций. «Возврат» в блоке 'with' будет выглядеть незаметно, но наносит вред во время выполнения. – pdw
Я понимаю и соглашусь с тем, что 'return' - большая проблема (так что' cleanup' намного лучше). Но разве 'goto' не требует строгого стандарта кодирования? Каковы преимущества goto, в этом отношении? – Elazar