Stavo cercando una macro che assomigli al con-costrutto. L'utilizzo dovrebbe essere qualcosa di simile:"con" macro in C
with (lock(&x), unlock(&x)) {
...
}
Potrebbe essere utile per altri scopi.
mi si avvicinò con questa macro:
#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__)
Ha 3 cicli annidati perché dovrebbe:
- Inizializza contatore di ciclo (solo C99, ovviamente)
- Possibilmente inizializzare _onenter variabile (ad esempio
with (int fd=open(..), close(fd))
) - Consentire
break
all'interno del blocco di codice. (continue
è consentito anche. E la macro potrebbe essere regolata perassert()
fuori)
ho usato sul codice per il sistema operativo XV6 e mi sembra molto utile.
La mia domanda è: quali sono i problemi peggiori con una tale macro? Voglio dire, oltre al semplice uso di una macro C (specialmente quella che implementa il nuovo costrutto del flusso di controllo).
finora hanno trovato questi inconvenienti/problemi:
- Nessun supporto per
return
ogoto
(ma si può risparmiare un po 'goto
s in codice del kernel) - Nessun supporto per gli errori (come
fd < 0
). Penso che questo sia risolvibile. - gnu89/c99 e solo sopra (contatore loop. Non è necessario il trucco variabile univoco)
- Un po 'meno efficiente del semplice blocco-sblocco. Credo che sia insignificante.
Ci sono altri problemi? C'è un modo migliore per implementare un costrutto simile in C?
Oh. risposta alla fine ... Grazie, non sapevo di "pulizia" - sembra utile. La macro ha problemi più specifici, oltre alla sua scarsità? – Elazar
La mancanza di supporto per 'return' sembra un rompicapo, a meno che non si stia lavorando con uno standard di codifica rigoroso contro le istruzioni return in mezzo alle funzioni. Un 'return' in un blocco' with' apparirebbe poco appariscente ma causerebbe il caos in fase di esecuzione. – pdw
Capisco e sono d'accordo sul fatto che 'return' è un grosso problema (quindi' cleanup' è molto meglio). Ma 'goto' non richiede uno standard di codifica altrettanto rigoroso? Quali sono i vantaggi di goto, in questo senso? – Elazar