Warum muss ich beim Erstellen einer C++-Klasse in Visual Studio 2013 über den Assistenten keine Header aus stdafx.h einschließen?

StackOverflow https://stackoverflow.com//questions/25028808

Frage

Ich habe eine Kuriosität gefunden, die ich nicht erklären kann.Wenn ich den Klassenerstellungsassistenten in VS2013 verwende, werden mir .h- und .cpp-Dateien mit definierter Klassenbasis erstellt.

Beispiel-Header-Datei:

#pragma once

class SomeClass
{
public:
    SomeClass();
    ~SomeClass();
};

Dann habe ich einige Verwendungen hinzugefügt.Ich habe Header mit diesen Namespaces in stdafx eingefügt.std und sf von SFML werden in meiner App verwendet:

#pragma once

using namespace std;
using namespace sf;

class SomeClass
{
public:
    SomeClass();
    ~SomeClass();
};

Und alles funktioniert gut.stdafx.h ist nicht in der Header-Datei enthalten, sondern nur in .cpp.

Aber dann werde ich die Header-Datei manuell erstellen (ohne .cpp) und dabei dieselbe Klassenstruktur verwenden:

#pragma once

using namespace std;
using namespace sf;

class SomeOtherClass
{
     public:
        SomeOtherClass();
        ~SomeOtherClass();
}

Und es funktioniert nicht.VS gibt an, dass der Namespace „sf“ nicht gefunden werden kann, es gibt jedoch keine Probleme mit dem Namespace „std“.

Und das ist es, was ich wissen möchte:Warum der erste Fall gültig ist und VS Namespaces aus vorkompilierten Headern gefunden hat und der zweite Fall nicht funktioniert.

War es hilfreich?

Lösung

Header-Dateien werden niemals alleine kompiliert.Nur dein cpp oder c Dateien werden kompiliert und die Header-Dateien werden vom Präprozessor in sie kopiert, wenn Sie #include ihnen.

Das bedeutet, dass alle Ihre CPP-Dateien, in die Sie einen Header einfügen, Ihre Namensräume haben Vor Wenn Sie den Header einfügen, wird es funktionieren.Weil der Compiler die Namespaces findet, bevor er den Code des Headers in dieser Datei kompiliert.

Es ist jedoch keine gute Übung.Ein Header sollte eigenständig funktionieren und nicht darauf angewiesen sein, dass die CPP-Datei vor dem Include etwas tut.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top