Problem mit der einfügung einer eigenen Header-Datei (gelöst)
-
hi also das mit5 dem inline ist nicht mein Fehler in meinem Buch stand das mann eine inline Funktion schreiben soll^^
bei dem anderen was du geschrieben hattest versteh ich nicht ganz was du meinst^^ kannst du vielleicht mal eine Beispiel machen?
fg Wurst
-
inline ist ein Hinweis an den Compiler. Schlussendlich entscheidet der, ob etwas geinliet wird, oder nicht. Und das ist so banal, dass es mit Sicherheit geinlinet wird.
Das mit dem Namespace meinte er so:
#ifndef _TOOL1_H_ #define _TOOL1_H_ namespace TOOL1 { inline double calculate(double x, double y) { return x + y; } } #endif...
#include<iostream> #include<tool1.h> // der namespace wird im Header selbst geöffnet using namespace std; int main() { cout << "Hallo C++ Forum"; }
-
achsooo...^^ ja hätte ich machen können aber in meiner Aufgabe stand das ich separate header-Dateien schreiben sollte.
Dank und fg, Wurst
-
wurstuk schrieb:
achsooo...^^ ja hätte ich machen können aber in meiner Aufgabe stand das ich separate header-Dateien schreiben sollte.
Dank und fg, Wurst
Das hat ja nichts mit dem Namespace zu tun..

Es isteinfach nur umständlich, wenn du jedes mal dieses komische Konstrukt haben musst, wenn du den Header benutzen willst. Das auszulagern macht einfach keinen Sinn.. Aber ich denke, dass du das auch verstanden hast.

-
jap

Danke u. fg Wurst

-
Also eine Funktion, die in der selben Datei, in der sie deklariert wurde, auch definiert wird, wird automatisch (wenn es der compiler für sinnvoll erachtet) geinlined - nur, wenn sie in einer anderen Datei steht, sollte man nen inline davor schreiben, damit der Compiler guckt, ob er sie nicht doch inlinen möchte...
das mit dem namespace:
/*tool*/ namespace TOOL1 { doulbe calc(double a, double b) { return a+b;} }#include "tool.h" //es gibt nen unterschied zwischen <> und "" beim include ^^ #include <iostream> int main() { std::cout << TOOL1::calc(2.3, 3.4); }sieht doch viel hübscher aus...
bb
-
unskilled schrieb:
Also eine Funktion, die in der selben Datei, in der sie deklariert wurde, auch definiert wird, wird automatisch (wenn es der compiler für sinnvoll erachtet) geinlined - nur, wenn sie in einer anderen Datei steht, sollte man nen inline davor schreiben, damit der Compiler guckt, ob er sie nicht doch inlinen möchte...
Falsch. Das gilt nicht für die Datei, sondern für Definitionen von Memberfunktionen in der Klassendefinition.
-
drakon schrieb:
unskilled schrieb:
Also eine Funktion, die in der selben Datei, in der sie deklariert wurde, auch definiert wird, wird automatisch (wenn es der compiler für sinnvoll erachtet) geinlined - nur, wenn sie in einer anderen Datei steht, sollte man nen inline davor schreiben, damit der Compiler guckt, ob er sie nicht doch inlinen möchte...
Falsch. Das gilt nicht für die Datei, sondern für Definitionen von Memberfunktionen in der Klassendefinition.
Hmm? Quelle?
/*main.cpp*/ #include "class.h" int main() { Ttest asd; asd.test(); }/*class.h*/ class Ttest { public: void test(); }; #include "class.inl"/*class.inl*/ #include <iostream> void Ttest::test() { std::cout << "asd"; }wird [1] zu:
int main() { Ttest asd; asd.test(); 000E1000 mov eax,dword ptr [__imp_std::cout (0E2054h)] 000E1005 push eax 000E1006 call std::operator<<<std::char_traits<char> > (0E1150h) 000E100B add esp,4 }1:
MSVC 9, Release, /O2, /Oi, /GL
(Command-Line ist mir zu vollgemüllt, weil nen Haufen zusätzliche Verzeichnisse in meinem Test-Projekt drin sind, damit ich das net jedes ma einzeln adden muss, wenn ich was testen möchte ^^)bb
edit:
War mir unsicher, obs vll ne andere Optimierung war - deshalb hab ich noch folgendes probiert:
mit/*class.inl*/ #include <iostream> __declspec(noinline) void Ttest::test() { std::cout << "asd"; }wird das ganze zu:
int main() { Ttest asd; asd.test(); 00D31010 call Ttest::test (0D31000h) }Das zeigt - die Fkt. wird automatisch geinlined - weil das #include ne textuelle Ersetzung ist, stehen Deklaration und Definition also in der gleichen Datei, aber die Definition ist nicht gleich bei der Deklaration geschehen...
Oder hab ich da nen Denkfehler?
das noinline ist MS-spezifisch - falls du die MSDN auf deinem PC hast:
ms-help://MS.VSCC.v90/MS.MSDNQTR.v90.en/dv_vclang/html/f259d55b-dec7-4bde-8cf9-14521e4fdc42.htmFalls nicht:
MSDN schrieb:
__declspec(noinline) tells the compiler to never inline a particular member function (function in a class).
It may be worthwhile to not inline a function if it is small and not critical to the performance of your code. That is, if the function is small and not likely to be called often, such as a function that handles an error condition.
Keep in mind that if a function is marked noinline, the calling function will be smaller and thus, itself a candidate for compiler inlining.
[Bsp]
-
Ja, klar. Implementierungsspezifische Optimierungen können natürlich anders wirken.

Und da inline zu nichts verpflichtet bringt es nichts den Output anzuschauen, da der Compiler optimieren darf, was er will. (unter den üblichen Voraussetzungen natürlich).Aber um trotzdem die Qulle zu nennen, die ich im Kopf hatte:
ISO/IEC 14882 9.3/2 schrieb:
A member function may be defined (8.4) in its class definition, in which case it is an inline member function
Und Optimierungen kommen ja erst dann dazu, wenn es gar keine Dateien mehr gibt, sondern wenn alle Abhängigkeiten bekannt sind. Von dem her spielt es keine Rolle, ob die Definition im Header selbst, oder in der cpp steht.
Imo ist inline eh recht sinnlos und gehört nicht wirklich in die Sprache. Vor allem mit so schwammigen Regeln..

-
drakon schrieb:
Imo ist inline eh recht sinnlos und gehört nicht wirklich in die Sprache. Vor allem mit so schwammigen Regeln..

Das kommt wahrscheinlich von früheren Zeiten, in denen solche Compileroptimierungen noch nicht Alltag waren. Da ich mir aber selber nicht sicher bin, habe ich zu diesem Thema einen Thread gestartet.
-
Hmm. Ich weiss nicht genau, wie das früher gelaufen ist, aber meiner Meinung hat das da einfach nichts zu suchen. Kann schon sein, dass es wirklich nötig war. Aber naja.
-
wurstuk schrieb:
...folgendes:
tool.h:
#ifndef ...da steht nur Tool.h...des halb meine antwort...hät ja sein können das du des ausversehen falsch benannt hast