Makro vs. statische Funktionen in der Kopfzeile

9

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.

wirrbel
quelle
4
Ich denke, Ihre Frage wurde möglicherweise hier beantwortet. Stackoverflow.com/questions/9104568/macro-vs-function-in-c und hier stackoverflow.com/questions/1358232/why-use-macros-in-c
Maru
Das Schreiben eines richtigen Makros ist ein Schmerz, und die inlineFunktionen 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 sparen
Ratschenfreak
2
Ich würde tatsächlich vermuten, dass die meisten davon historische Gründe sind. Vor langer Zeit hatten die C-Compiler überhaupt keine Inline-Funktionen. Also verwendeten die Leute Makros für Dinge, die sie inline wollten. C-Code ist normalerweise ungewöhnlich langlebig.
Jan Hudec
@ratchetfreak: C hat nicht inline, hier geht es nicht um C ++.
Wirrbel
2
@wirrbel Natürlich gibt es inlinein C, zumindest seit C99. Eine schnelle Übersicht finden Sie in Wikipedia zu Inline-Funktionen .
Amon

Antworten:

6

Makros, die durch einen Funktionsaufruf lösbar sind, haben viele Fallstricke:

  • Sie sind schwer zu schreiben, da Sie möglicherweise mit Argumenten wie richtig umgehen müssen ++i.
  • Sie sind mit einem visuellen Debugger schwer zu debuggen, da Sie dort kein Makro durchlaufen oder keinen Haltepunkt setzen können.
  • Sie sind bei der Analyse von Kompilierungsabhängigkeiten schwer richtig zu handhaben.

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.

Normalerweise sind C-Funktionen nicht inline, da sie möglicherweise mit anderen C-Dateien verknüpft sind.

Es gibt keinen Grund, warum ein Compiler nicht in der Lage wäre, zwei Versionen einer Funktion bereitzustellen, eine traditionelle callund eine inlined- 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.)

user40989
quelle