Funzioni macro e statiche nell'intestazione


9

per molte attività rapide in cui si potrebbe impiegare una funzione f(x,y), in semplice C, vengono utilizzate le macro. Vorrei fare domande specifiche su questi casi, che sono risolvibili con una chiamata di funzione (ovvero macro utilizzate per allineare funzioni, non per espandere il codice di codice arbitrario).

In genere le funzioni C non sono incorporate poiché potrebbero essere collegate ad altri file C. Tuttavia, le funzioni C statiche sono visibili solo all'interno del file C in cui sono definite. Pertanto possono essere incorporate dai compilatori. Ho sentito che molte macro dovrebbero essere sostituite trasformandole in funzioni statiche, perché questo produce un codice più sicuro.

Ci sono casi in cui questa non è una buona idea?

Di nuovo: non chiedere informazioni sulle macro di Code-Production con costrutti simili a ## che non possono essere espressi affatto come una funzione.


4
Penso che alla tua domanda potrebbe essere stata data una risposta qui stackoverflow.com/questions/9104568/macro-vs-function-in-c e qui stackoverflow.com/questions/1358232/why-use-macros-in-c
Maru

scrivere una macro corretta è una seccatura, e le inlinefunzioni ing assicurano solo che possa essere definita più volte nel file binario, il compilatore può decidere se effettivamente lo inline per forse risparmiare spazio
maniaco del cricchetto

2
In realtà sospetterei che la maggior parte di questi sono motivi storici. Tempo fa, i compilatori C non incorporavano affatto le funzioni. Quindi le persone hanno usato le macro per le cose che volevano in linea. Il codice C è di solito insolitamente longevo.
Jan Hudec,

@ratchetfreak: C non ha inline, questo non riguarda C ++.
Wirrbel,

2
@wirrbel Naturalmente c'è inlinein C, almeno da C99. Per una rapida panoramica, vedi Wikipedia sulle funzioni incorporate .
amon

Risposte:


6

Le macro risolvibili con una chiamata di funzione presentano molte insidie:

  • Sono difficili da scrivere, perché potresti dover gestire correttamente argomenti come ++i.
  • Sono difficili da eseguire il debug con un debugger visivo poiché non è possibile scorrere una macro o inserire un punto di interruzione lì.
  • Sono difficili da gestire correttamente quando si analizzano le dipendenze delle compilation.

Le macro che sono risolvibili con una chiamata di funzione potrebbero essere state utili per fornire inline in un compilatore primitivo. Non sono a conoscenza di alcun compilatore che non gestisca le funzioni incorporate e alcuni possono persino integrarsi tra le unità di compilazione.

In genere le funzioni C non sono incorporate poiché potrebbero essere collegate ad altri file C.

Non vi è alcun motivo per cui un compilatore non sia in grado di fornire due versioni di una funzione, una tradizionale called inlineun'altra. Dovresti guardare la documentazione del compilatore che stai prendendo di mira. Inoltre, potresti voler esaminare l'assemblaggio generato: anche se non conosci l'assemblaggio, puoi imparare rapidamente a capire se una funzione è stata incorporata o meno. (Inizia con esempi per bambini per imparare rapidamente questo.)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.