Szukałem makra, które będzie przypominało z-konstrukt. Wykorzystanie powinno być coś takiego:"z" makro w C
with (lock(&x), unlock(&x)) {
...
}
może to być przydatne dla innych celów.
wymyśliłem tego makro:
#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__)
Ma 3 zagnieżdżonej pętli, ponieważ powinien on:
- inicjalizacji licznika pętli (tylko C99, oczywiście)
- Ewentualnie zainicjowania zmiennej _onenter (taki jak
with (int fd=open(..), close(fd))
) - Zezwól
break
wewnątrz bloku kodu. (continue
zbyt wolno. A makro mogą być dostosowane doassert()
go)
użyłem go w kodzie dla XV6 OS i wydaje się całkiem użyteczne.
Moje pytanie brzmi - jakie są najgorsze problemy z takim makro? Mam tu na myśli, oprócz samego użycia makra C (szczególnie takiego, który implementuje nowy konstruktor sterujący przepływem).
Dotychczas odkryli tych wad/problemów:
- Brak wsparcia dla
return
lubgoto
(ale może to zaoszczędzić trochęgoto
S w kodzie jądra) - brak wsparcia dla błędów (takich jak
fd < 0
). Myślę, że ten jest naprawialny. - gnu89/c99 i więcej tylko (licznik pętli, unikalna zmienna sztuczka nie jest konieczna)
- Nieco mniej wydajna niż prosta blokada-odblokowanie. Uważam, że to nieistotne.
Czy są jakieś inne problemy? Czy istnieje lepszy sposób na wdrożenie podobnej konstrukcji w C?
Oh. Odpowiedź w końcu ... Dziękuję, nie wiedziałem o "oczyszczeniu" - dźwięki przydatne. Czy makroprojekt ma bardziej specyficzne problemy, oprócz swojej niedorzeczności? – Elazar
Brak wsparcia dla 'return' wydaje się być łamaczem transakcji, chyba że pracujesz z ścisłym standardem kodowania przeciwko instrukcjom' return' w środku funkcji. 'Return' w bloku' with' będzie wyglądać niepozornie, ale może siać spustoszenie w czasie wykonywania. – pdw
Rozumiem i zgadzam się, że 'return' jest dużym problemem (więc' cleanup' jest znacznie lepszy). Ale czy "goto" nie wymaga równie surowego standardu kodowania? Jakie są zalety goto w tym zakresie? – Elazar