Generalmente è incoraggiato o scoraggiato creare una macro pre-processore in C, che facilita la creazione di molte funzioni con la stessa firma (diversa solo nel nome). Ad esempio, anziché:
obj *car(const obj *args, obj **envp, GarbageCollector *gc) { ... }
obj *cdr(const obj *args, obj **envp, GarbageCollector *gc) { ... }
obj *cons(const obj *args, obj **envp, GarbageCollector *gc) { ... }
...
che potresti fare:
#define DEF_PRIMITIVE(name) obj *name(const obj *args, obj **envp, GarbageCollector *gc)
DEF_PRIMITIVE(car) { ... }
DEF_PRIMITIVE(cdr) { ... }
DEF_PRIMITIVE(cons) { ... }
...
il punto è di ridurre la noiosa ripetizione nel codice. Riesco a vedere diversi argomenti su entrambi i lati per capire se questa sia una buona idea.
Motivi per farlo
- Aumento della leggibilità del codice
- Maggiore facilità di modifica della firma. Ad esempio, se è necessario modificare la firma di tutte queste funzioni, è necessario eseguirla in un unico punto. (Nel mio caso, ho dovuto cambiare tutte le firme una volta ed è stato un vero dolore)
- Potenziale riduzione degli errori e tempo trascorso quando si creano nuove funzioni di questo tipo.
Motivi per non farlo
- Oscura gli argomenti delle funzioni, rendendo poco chiaro a qualcuno che non ha familiarità con il codice quali sono gli argomenti della funzione (se non capita di vedere o trovare la definizione della macro).
- Alcuni IDE hanno problemi con queste definizioni che inibiscono la capacità dell'IDE di rifattorizzare o ragionare sull'uso della funzione.
- L'uso estensivo di macro è generalmente scoraggiato nei programmi in C e gli errori in essi generano generalmente difficoltà nell'identificazione dei bug.