21

Ich verstehe den Zweck und die Argumentation hinter vorkompilierten Headern. Welche Regeln gelten für die Implementierung? Von meinem Verständnis geht es in etwa so:So implementieren Sie vorkompilierte Header in Ihr Projekt

  1. Legen Sie Ihr Projekt für die Verwendung vorkompilierte Header mit der YU-Anweisung.
  2. Erstellen Sie Ihre stdafx.h-Datei und legen Sie das als vorkompilierten Header fest.
  3. Fügen Sie dies als oberste include-Anweisung in jede Ihrer .h-Dateien ein.

Ist das korrekt? Sollten Sie das Einfügen in die Dateien ausschließen, die in Ihrem vorkompilierten Header enthalten sind? Derzeit ich die folgenden Kompilierung-Fehler, wenn dies meine Intuition mit folgenden:

Fehlern C2857: ‚# include‘ Anweisung mit der Befehlszeilenoption /Ycstdafx.h angegeben wurde nicht in die Quelldatei gefunden

Die Befehlszeilenoptionen sind als solche:

/Od/I "../External/PlatformSDK/Include"/I ".."/I“../ Extern/atlmfc/Include " /D" _DEBUG "/ D" _UNICODE "/ D" UNICODE " /Gm/EHsc/RTC1/MDd/Yc" stdafx.h " /Fp".... \ Ausgang \ LudoCore \ Debug \ LudoCore.pch " /Fo" .... \ Ausgabe \ LudoCore \ Debug \ " /Fd"....\Output\LudoCore\Debug\vc80.pdb" /W4/WX/nologo/c/ZI/TP/wd4201 /Errorreport: Prompt

Antwort

34

Sie stdafx.cpp sollten stdafx.h umfassen und mit /Yc"stdafx.h" gebaut werden.

Ihre andere * .cpp sollte stdafx.h enthalten und mit /Yu"stdafx.h" erstellt werden.

Beachten Sie die doppelten Anführungszeichen in den Compileroptionen!

Hier ist ein Screenshot der Visual Studio-Einstellungen für stdafx.cpp eine vorkompilierte Header zu erstellen:

create precompiled header

Hier werden die entsprechenden Befehlszeilenoptionen (die schreibgeschützt sind, sondern spiegeln die Einstellungen festgelegt auf anderen Seiten, beachten Sie, dass die IDE doppelte Anführungszeichen um den Dateinamen, die in der Compiler-Option fügt):

options

Dies ist, was in meinem ist stdafx.cpp Datei:

// stdafx.cpp : source file that includes just the standard includes 
// CallWinsock.pch will be the pre-compiled header 
// stdafx.obj will contain the pre-compiled type information 

#include "stdafx.h" 

// TODO: reference any additional headers you need in STDAFX.H 
// and not in this file 
+0

Wollen Sie damit sagen, dass dies nur auf der Kommandozeile gebaut werden sollte? Im Visual Studio bin ich mir nicht sicher, wie ich auf Anhieb etwas mit einer bestimmten Eigenschaft erstellen kann. Es scheint immer nur "Hinzufügen -> Neues Element -> Kopfzeile", usw. zu sein. – Chris

+0

Klicken Sie mit der rechten Maustaste auf die cpp-Datei und wählen Sie "Eigenschaften" im Kontextmenü. Unter den C++ - Konfigurationseigenschaftsseiten gibt es eine für "Vorkompilierte Header", mit der Sie angeben, dass diese CPP-Datei eine vorkompilierte Headerdatei erstellt oder verwendet. – ChrisW

+0

Danke für das Update. Ich habe es wie oben gezeigt gemacht und immer noch keine Würfel. Hier ist die Befehlszeilenoptionen in Bezug auf Ihr oben:/Od/I "../External/PlatformSDK/Include"/I ".."/I "../External/atlmfc/Include"/D "_DEBUG"/D "_UNICODE"/D "UNICODE"/Gm/EHsc/RTC1/MDd /Yc"stdafx.h "/Fp"..\..\Output\LudoCore\Debug\LudoCore.pch"/Fo“.. \. . LudoCore \ Debug \\ "/Fd"..\..\Output\LudoCore\Debug\vc80.pdb" \ Output \/W4/WX/nologo/c/ZI/TP/wd4201/Errorreport: Prompt – Chris

5

Ihre #include "stdafx.h" sollte die erste Zeile jeder CPP-Datei sein. Es sollte nicht in den .h-Dateien verwendet werden. Ansonsten bist du in etwa richtig.

+0

Ich denke sein Problem ist/Ycstdafx.h anstelle von/Yc"stdafx.h ". – ChrisW

5

"stdafx" ist nur eine Konvention. Es ist keineswegs obligatorisch. In einer Multiprojektlösung habe ich andere Setups mit mehreren vorkompilierten Headern für verschiedene Teile verwendet. Z.B.Es kann nützlich sein, dass ein PCH von Ihren UI-Projekten und ein anderer für Ihre Datenbankprojekte freigegeben wird.

Die relevanten Komponenten sind die XH-Datei, die vorkompilierbare Header auflistet, die X.cpp-Datei, die nur Xh enthält (und selbst keinen Code hinzufügt), und die X.pch-Datei, die durch Kompilieren von X.cpp (und damit Xh) erstellt wird Compiler-Option /Yc.

Wenn Sie jetzt Y.cpp Datei mit /Yu"X.pch" kompilieren, der Compiler liest und verwirft alles bis zu #include "X.h". An diesem Punkt ersetzt es seinen internen Zustand durch den in X.pch gespeicherten Zustand, mit Ausnahme des Eingabestroms (bleibt Y.cpp, wobei der Dateizeiger auf die nächste Zeile nach #include "X.h" gesetzt wird).

+0

Nur bearbeitet, um einen Tippfehler zu beheben. –

10

Visual Studio speichern kann vorkompilierte Header Eigenschaften nicht nur von Projekt, sondern durch Quelldatei.

Standardmäßig sind alle Eigenschaften auf "Erben von Parent- oder Projektstandardwerten" festgelegt, die nur den Wert des übergeordneten Objekts für diese Eigenschaft anzeigen, aber nach der Überschreibung auf untergeordneter Ebene (in diesem Fall eine CPP-Datei) ignoriert die Datei Änderungen von der übergeordneten Eigenschaft.

Die Konfiguration Sie wollen, ist:

  1. Auf Projektebene mit „Alle Konfigurationen“ ausgewählt (Projekteigenschaften, Drop-Konfiguration ändern unten von Debug/Release) Stellen Sie Ihren vorkompilierte Header auf „Verwenden Sie“
  2. wählen Sie eine CPP-Datei die Quelle des Headers zu sein (soweit ich weiß, keine Rolle spielt, welche)
  3. Rechts klicken und gehe zu Eigenschaften, und wählen Sie „Create“ für vorkompilierte Header
  4. Schließlich stellen Sie sicher, dass für keine anderen CPP-Dateien Werte für das vorkompilierte Objekt festgelegt sind Header-Eigenschaft (Sie können durch den fett gedruckten Text sagen)
+0

Ein Schreibfehler wurde behoben: "per-compiled" wurde auf "vorkompiliert" korrigiert. –