Dichiarare le funzioni usando i macro?

1

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

  1. Aumento della leggibilità del codice
  2. 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)
  3. Potenziale riduzione degli errori e tempo trascorso quando si creano nuove funzioni di questo tipo.

Motivi per non farlo

  1. 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).
  2. Alcuni IDE hanno problemi con queste definizioni che inibiscono la capacità dell'IDE di rifattorizzare o ragionare sull'uso della funzione.
  3. L'uso estensivo di macro è generalmente scoraggiato nei programmi in C e gli errori in essi generano generalmente difficoltà nell'identificazione dei bug.
posta Jon Deaton 01.04.2018 - 18:46
fonte

1 risposta

2

Il modo in cui vengono utilizzate le macro rende molto difficile per un programmatore ragionare su di esse, e indovina quale sarebbe il risultato di una macro. Per qualsiasi cosa tranne gli esempi più elementari, le macro di solito portano a casi limite e problemi che sarebbe molto difficile eseguire il debug.

Storicamente, i macro erano utili per scopi di ottimizzazione: una chiamata in meno a una funzione significava che alcuni cicli della CPU venivano salvati, il che sarebbe un grosso problema.

Oggi difficilmente troverai te stesso nel caso in cui le chiamate di funzione saranno il collo di bottiglia del tuo codice. Soprattutto perché "una funzione inline è veloce come una macro."

Quindi, no, per motivi di leggibilità, manutenzione e mal di testa ridotto, non dovresti usare macro invece di funzioni. Le funzioni offrono il vantaggio del controllo dei tipi e, se modifichi di conseguenza il codice e le opzioni del compilatore, le stesse prestazioni delle macro.

    
risposta data 01.04.2018 - 21:12
fonte

Leggi altre domande sui tag