Funktionen, die while enthalten, werden nicht als Inline expandiert
-
ja. sind beide inline
Meep Meep
-
Hallo
dann ist doch das einfachte, das inline bei deiner Funktion wegzumachen.
Denn die Meldung besagt ja, das der Compiler das eh nicht macht, warum also ein Workaround für ein überflüssiges Problem?
Der Compiler weiß meinstens besser was er inlinen soll und was nicht.bis bald
akari
-
re
akari schrieb:
dann ist doch das einfachte, das inline bei deiner Funktion wegzumachen.
Denn die Meldung besagt ja, das der Compiler das eh nicht macht, warum also ein Workaround für ein überflüssiges Problem?
Der Compiler weiß meinstens besser was er inlinen soll und was nicht.
akaribei template-klassen bringt er mir auch ohne dem inline diese meldung.
wofuer waere dann inline noch gut, wenns der compiler von selber einsetzt wann er "glaubt" das es ihm jetz grad gefaellt. als programmierer weiß man vielleicht das die schleife nur 3-4-5 mal ausgefuehrt wird. das kann der compiler eigendlich nicht wissen, wenn die werte zur compile-time nicht feststehen.
ausserdem ist es laesstig wenn man 120-130 warnungen deswegen bekommt.gab es hier nicht schon paar threads zu dem thema templates ? da hiess es doch, wenn ich mich recht erinnere, das man template-klassen komplett in die header-datei schreiben muss. weil die meisten compiler es derzeit nicht anders koennen. daher muesste dann doch vom ?linker? immer die ganze funktion ob mit oder ohne schleifen anstatt des funktionsaufrufes eingesetzt werden. oder hab ich das da falsch verstanden.
auf jeden fall kann ich bei meinem kompiler template-klassen nicht in header und cpp dateien aufteilen. obwohl es der uebersicht dienlich waereMeep Meep
-
Das inline wegzumachen nützt beim BCB nicht unbedingt was, da er im Header definierte Funktionen automatisch inline macht.
@Meep Meep
Hast du die algorithm und alle darin inkludierten Header nach einer derartigen warning durchsucht? Verwendest du for_each in deinem Quelltext?[edit]
Das inline ist sowieso nur eine Empfehlung an den Compiler. Zwingen kannst du ihn nicht. Manche Compiler haben zwar ein forceinline, ob das aber immer funktioniert weiß ich nicht.
Zum Aufteilen von templates in cpp und h gibt es eigentlich das Schlüsselwort export, was aber kaum ein Compiler unterstützt. Du könntest aber trotzdem Aufteilen und dann am Ender der Headerdate die cpp inkludieren. algorithm mach das beim BCB5 auch so.
Bezüglich while kannst du ja mal versuchen diese durch eine for-schleife zu ersetzen.
[edit]
-
re
Braunstein schrieb:
@Meep Meep
Hast du die algorithm und alle darin inkludierten Header nach einer derartigen warning durchsucht? Verwendest du for_each in deinem Quelltext?beim durchsuchen der includes bin ich nur auf -w-inl gestossen, was aber dafuer sorgt das es angezeigt werden soll. den comiler-switch zum abschalten hab ich nicht gefunden.for_each verwende ich auch, jo. sowie nen haufen anderer funktionen aus <algorithm>.
ist ansich mit inline asm ja das gleiche problem. seit dem SP4 des BCB werden __asm inlines naemlich als funktion betrachtet. da seh ich das ja auch ein, das man da vorsichtshalber die register sichern soll, weil der comiler ja nicht weiß was der programmierer da macht.Braunstein schrieb:
Zum Aufteilen von templates in cpp und h gibt es eigentlich das Schlüsselwort export, was aber kaum ein Compiler unterstützt. Du könntest aber trotzdem Aufteilen und dann am Ender der Headerdate die cpp inkludieren. algorithm mach das beim BCB5 auch so.
inwiefern ist das mit anderen compilern kompatibel ?
apropo kompatibel: gibt es auch im std festgelegte compiler-switches die jeder compiler haben sollte ?
Meep Meep
-
-w-inl schaltet meines Wissens nach die Warnung ab.
Aus der HilfeTo disable a message from the command line, use the command-line option -w-xxx.
Es gibt keine genormten Compileroptions.
-
(Die Kommandozeilenoption zur Anzeige dieser Warnung lautet -w-inl)das steht bei mir in der hilfe. oder interpretiere ich den satz falsch?
Meep Meep
-
Ich weiß nicht wo du das her hast, aber bei mir steht eher das Gegenteil.
Ein weiteres Zitat aus der Hilfe-wxxx xxx-Warnmeldung einschalten
-w-xxx xxx-Warnmeldung ausschalten[edit]Das obige Zitat ist aus dem BCB5, das hier aus dem BCB6.[edit]
-
re
ich verwende den bcb6.
unter meinem code-fenster hab ich das ausgabefenster das mir beim kompilieren alles moegliche anzeigt. da steht z.b. folgende meldung drinnen:[C++ Warnung] ValueFormat.h(62): W8027 Funktionen, die while enthalten, werden nicht als Inline expandiertwenn ich dann auf die meldung drauf klicke, und F1 druecke, macht ein Hilfefenster auf. unter anderem steht dann da:
W8027 Funktionen, die ‘anweisung’ enthalten, werden nicht als Inline expandiert Compiler-Warnung (Die Kommandozeilenoption zur Anzeige dieser Warnung lautet -w-inl)Meep Meep
-
Meep Meep schrieb:
bei template-klassen bringt er mir auch ohne dem inline diese meldung.
Wenn du die Methoden der Klasse innerhalb der Klassendeklaration definierst, dann nimmt der Compiler immer an, es sei inline:
template <typename T> class Klasse { public: void tuwas () { int i = 2; } };ist das Selbe wie:
template <typename T> class Klasse { public: void tuwas (); }; template <typename T> inline void Klasse<T>::tuwas () { int i = 2; }Braunstein schrieb:
Das inline wegzumachen nützt beim BCB nicht unbedingt was, da er im Header definierte Funktionen automatisch inline macht.
Wenn er das tut, müsste er falsch liegen, s.o.
Braunstein schrieb:
Zum Aufteilen von templates in cpp und h gibt es eigentlich das Schlüsselwort export, was aber kaum ein Compiler unterstützt. Du könntest aber trotzdem Aufteilen und dann am Ender der Headerdate die cpp inkludieren. algorithm mach das beim BCB5 auch so.
Dann nenn sie aber bitte nicht cpp (sondern z.B. ipp oder tpp, denk dir was aus) und leg sie in ein Unterverzeichnis des Headerverzeichnisses, sonst ist doch eine gewisse Verwechslungsgefahr gegeben. (Außerdem weigern sich da iirc einige Compiler).
-
Wenn er das tut, müsste er falsch liegen, s.o.
Was soll das jetzt beweisen? Das ist doch in etwa das, was ich geschrieben habe. Lediglich auf Klassenmemberfunktionen eingeschränkt.
Dann nenn sie aber bitte nicht cpp...
Ich habe weder gesagt, dass ich sie so nenne, noch das ich das überhaupt mache. Es war lediglich ein Hinweis, das das möglich ist.
-
re
also scheinbar hab ich heute leichte probleme die deutsche sprache zu verstehen:
.filmor schrieb:
Meep Meep schrieb:
bei template-klassen bringt er mir auch ohne dem inline diese meldung.
Wenn du die Methoden der Klasse innerhalb der Klassendeklaration definierst, dann nimmt der Compiler immer an, es sei inline:
template <typename T> class Klasse { public: void tuwas () { int i = 2; } };ist das Selbe wie:
template <typename T> class Klasse { public: void tuwas (); }; template <typename T> inline void Klasse<T>::tuwas () { int i = 2; }das beudeutet also das der kompiler, egal ob ich den code direkt in die header schreibe oder auch nicht, immer ne inline daraus machen will.
.filmor schrieb:
Braunstein schrieb:
Das inline wegzumachen nützt beim BCB nicht unbedingt was, da er im Header definierte Funktionen automatisch inline macht.
Wenn er das tut, müsste er falsch liegen, s.o.is das nicht gerade das, was du oben gemeint hattest ?
hast du da allgemeine klassen oder template-klassen gemeint ?
wenn fuer den kompiler es immer inline ist, dann kriegt man die warnungen ja garnet mehr weg.
ich glaub ich steh am schlauchMeep Meep
-
Nein, ich dachte das wäre klar geworden. Der Compiler weiß überhaupt nichts von Headern, er kommt erst nach dem Präprozessor dran.
Wenn du eine Methode nicht geinlined haben willst, dann musst du sie außerhalb der Klasse definieren (und das inline weglassen):template <typename T> class Klasse { public: void tuwas (); }; template <typename T> void Klasse<T>::tuwas () { int i = 2; }Das Template-Beispiel habe ich nur deshalb genommen, weil da das "Problem" häufiger ist, weil man meistens in der Klassendeklaration implementiert. Es gilt aber genauso für normale Klassen.