2012-04-10 5 views
1

Ich habe zwei Dateien, my_program.cpp und seine Kopfzeile my_program.h.Seltsames C++ - Verhalten mit Iostream und Wstring

my_program.cpp enthält nur dies:

#include "my_program.h" 
using namespace std; 

my_program.h einen Zeiger auf eine Funktion enthält, die eine wstring zurückkehrt, wie folgt:

using namespace std; 
typedef wstring (*my_function)(wstring, int, int, int, int); 

Das Programm kompiliert nicht in diesem Zustand (stoppt bei typedef ... sagt, dass ISO C++ die Deklaration von 'wstring' ohne Typ verbietet, aber wenn ich #include <iostream> vor #include "my_program.h" in der .cpp hinzufüge Datei, kompiliert das Programm auf wundersame Weise.

Warum passiert das? Ich hoffe nur, dass ich keinen dummen Fehler gemacht habe und jetzt werde ich ausgelacht.

+0

Ich kann diese Typdef-Deklaration nicht vollständig lesen, aber ... wo ist Ihr neuer Typname in diesem Typedef? – Frizi

+1

Haben Sie '# ' in 'my_porgram.h'? – scientiaesthete

+1

@Frizi 'my_function' ist der Name des typedef. Es ist ein Zeiger auf eine Funktion, die wstring zurückgibt und wstring, int, int ... als Parameter hat. –

Antwort

5

Sie sollten wirklich einschließen <string>.

Aus dem Sound der Dinge, Ihrem Compiler ist <iostream>, so funktioniert es, aber auf einem anderen Compiler kann es nicht. C++ erlaubt einem Standardheader, andere Standardheader aufzunehmen, erfordert dies jedoch nicht. In einigen Fällen erhalten Sie nur eine Deklaration der Klasse, sodass einige Dinge funktionieren und andere nicht.

Zumindest nach meiner Erfahrung ist dies auch ein Problem, das sich wahrscheinlich von einer Version eines Compilers zum nächsten ändert. Selbst wenn Sie nicht beabsichtigen, etwas anderes zu portieren, funktioniert der Code möglicherweise nicht mehr ordnungsgemäß zu einem scheinbar trivialen Upgrade, wenn Sie nicht die richtige Kopfzeile enthalten.

+0

Mein schlechtes. Ich hätte das wissen müssen. Vielen Dank. –

0

Bevor Sie #include <iostream> hinzufügen, hat der Compiler keine Ahnung, was wstring ist - daher der Fehler

Nachdem Sie die iostream-Header enthalten, (die std::wstring definiert - möglicherweise über andere Header, die es enthält), der Compiler weiß, was wstring bezieht sich auf und kann die typedef richtig analysieren.

Eine Sache zu beachten ist, dass der Compiler nur interessiert, was heißt die Kompilierungseinheit (.cpp-Dateien), nicht die Header; Die Header kommen ins Spiel, wenn eine Kompilierungseinheit sie enthält (man denke an wörtliches Kopieren und Einfügen). Daher können Sie iostream (oder wie andere hingewiesen <string>) überall vor der typedef, um es funktionieren zu lassen - aus dieser Perspektive, einschließlich es vor der Kopfzeile zählt das gleiche wie einschließlich es in der ersten Zeile der Kopfzeile.

Es ist jedoch im Allgemeinen eine gute Idee, Header möglichst selbstkonsistent zu machen (also in Ihrem Fall die entsprechenden Header in Ihrer Kopfzeile anstelle der .cpp), damit sich die Incluender nicht merken müssen andere Header zu enthalten, so dass es wie vorgesehen funktioniert.

+0

Ich habe 'using namespace std;' vor '#include" my_program.h "' in die cpp verschoben und es ist dasselbe. –

+0

Nicht sicher, was Sie mit "es ist das gleiche" bedeuten, aber die 'using namespace std; -Deklaration" hebt "alles im' std' Namespace in den globalen Namespace, so dass Sie nicht alles mit 'std' voranstellen müssen zB 'wstring' anstelle von' std :: wstring') - es sollte keinen Unterschied machen, ob es in der .cpp oder der header in diesem Fall ist, solange es hinter dem 'include ' und vor dem 'typedef steht ' – Attila