Funzioni Macro e Statiche nell'intestazione

9

per molte attività rapide in cui è possibile utilizzare una funzione f(x,y) , in C normale vengono utilizzate macro. Vorrei chiedere specificamente su questi casi, che sono risolvibili con una chiamata di funzione (cioè le macro utilizzate per le funzioni di inlining, non per l'espansione del codice di codice arbitrario).

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

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

Anche in questo caso: non chiedere informazioni sulle macro di Code-Production con costrutti ## simili che non possono essere espressi come una funzione.

    
posta wirrbel 18.10.2013 - 10:21
fonte

1 risposta

6

I macro risolvibili con una chiamata di funzione hanno molte insidie:

  • Sono difficili da scrivere, perché potresti dover gestire correttamente argomenti come ++i .
  • È difficile eseguire il debug con un debugger visivo poiché non è possibile scorrere una macro o mettici un breakpoint.
  • 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 l'inlining in un compilatore primitivo. Non sono a conoscenza di alcun compilatore che non gestisce le funzioni inline e alcuni possono persino essere in linea tra le unità di compilazione.

Typically C functions are not inlined since they might be linked to from other C files.

Non c'è motivo per cui un compilatore non sia in grado di fornire due versioni di una funzione, una tradizionale call ed una e una inline d una. Dovresti dare un'occhiata alla documentazione del compilatore che stai cercando. Inoltre, potresti voler esaminare l'assembly generato: anche se non conosci l'assembly, puoi imparare rapidamente a capire se alcune funzioni sono state o meno in linea. (Inizia con esempi di bambino per imparare rapidamente questo.)

    
risposta data 20.11.2013 - 13:02
fonte

Leggi altre domande sui tag