Für viele schnelle Aufgaben, bei denen eine Funktion verwendet werden kann f(x,y)
, werden in einfachem C Makros verwendet. Ich möchte speziell nach diesen Fällen fragen, die durch einen Funktionsaufruf lösbar sind (dh Makros, die für Inlining-Funktionen verwendet werden, nicht für die Code-Erweiterung von beliebigem Code).
Normalerweise sind C-Funktionen nicht inline, da sie möglicherweise mit anderen C-Dateien verknüpft sind. Statische C-Funktionen sind jedoch nur in der C-Datei sichtbar, in der sie definiert sind. Daher können sie von Compilern eingefügt werden. Ich habe gehört, dass viele Makros ersetzt werden sollten, indem sie in statische Funktionen umgewandelt werden, da dies sichereren Code erzeugt.
Gibt es Fälle, in denen dies keine gute Idee ist?
Nochmals: Nicht nach Code-Production-Makros mit ##-ähnlichen Konstrukten fragen, die überhaupt nicht als Funktion ausgedrückt werden können.
inline
Funktionen stellen nur sicher, dass es mehrmals in der Binärdatei definiert werden kann. Der Compiler kann entscheiden, ob es tatsächlich inline wird, um möglicherweise Platz zu spareninline
, hier geht es nicht um C ++.inline
in C, zumindest seit C99. Eine schnelle Übersicht finden Sie in Wikipedia zu Inline-Funktionen .Antworten:
Makros, die durch einen Funktionsaufruf lösbar sind, haben viele Fallstricke:
++i
.Makros, die durch einen Funktionsaufruf lösbar sind, könnten nützlich gewesen sein, um Inlining in einem primitiven Compiler bereitzustellen. Mir ist kein Compiler bekannt, der keine Inline-Funktionen verarbeitet, und einige können sogar über Kompilierungseinheiten hinweg inline arbeiten.
Es gibt keinen Grund, warum ein Compiler nicht in der Lage wäre, zwei Versionen einer Funktion bereitzustellen, eine traditionelle
call
und eineinline
d- Version . Sie sollten sich die Dokumentation des Compilers ansehen, auf den Sie abzielen. Möglicherweise möchten Sie auch die generierte Assembly betrachten: Selbst wenn Sie die Assembly nicht kennen, können Sie schnell feststellen, ob eine Funktion eingebunden wurde oder nicht. (Beginnen Sie mit Babybeispielen, um dies schnell zu lernen.)quelle