2016-06-15 10 views
-1

Ich habe versucht, ein Programm in C zu kompilieren ++ switch-Anweisung verwenden, aber ich habe eine Warnmeldung, dassFunktionsschalter enthalten, werden nicht inline in C erweitert ++

„Funktionsschalter enthalten, werden nicht inline erweitert“

, gab mein Programm korrekte Ausgabe, aber ich möchte wissen, was die Bedeutung dieser Warnmeldung bedeutet.

+1

Bitte veröffentlichen Sie ein [minimales, vollständiges und verifizierbares Beispiel] (http://stackoverflow.com/hilfe/mcve). –

+1

Sehen Sie http://docs.embarcadero.com/products/rad_studio/radstudio2007/RS2007_helpupdates/HUpdate4/EN/html/devwin32/wrnnoinlexp_xml.html – Jarod42

Antwort

1

Benötigen mehr Eingaben, um Ihre Frage zu beantworten. (Vielleicht hilft Ihnen Ihr Code-Snippet, die Dinge besser zu verstehen)

Verwenden Sie Inline-Schlüsselwort explizit für die Funktion, die den Schalter in Ihrem Code enthält ?! Nun, wenn Sie haben (ich nehme an, Sie haben) dann, wollte nur sagen, dass Compiler die Anfrage für die Behandlung der Funktion als Inline ignorieren kann. Es gibt nur wenige Fälle, in denen der Compiler die Inline-Funktionen ignorieren können, sind sie wie folgt:

  • Funktion eine Schleife enthält. (für, während, während-Weile)
  • Funktion enthält statische Variablen.
  • rekursive Funktion
  • Funktion enthält Schalter
  • Funktion goto-Anweisung enthält.

Oben sind die paar Bedingungen, die ich vorerst erinnern kann.

0

Während dies vom Standard nicht gefordert wird, wird der Schalter normalerweise in ein Array von Funktionszeigern übersetzt, wobei der Schalterparameter der Schlüssel ist. Wäre die Funktion inlined gewesen, hätten Sie an jeder Stelle eine separate Kopie dieses Arrays benötigt, da sich Funktionszeiger unterscheiden könnten. Dies ist sehr ineffizient (sowohl hinsichtlich des Arbeitsspeichers als auch der Geschwindigkeit, aufgrund der Funktionsweise des Caches). Dieser Compiler könnte entscheiden, ihn nicht zu inline zu schreiben. (Ein cleverer Compiler auf einer cleveren Architektur kann relative Adressen des Programmzählers in diesem Array verwenden, daher ist dieses Verhalten Compiler-spezifisch.)