Was macht #pragma hdrstop ohne Parameter bei Verwendung in mehreren Dateien?

8

Was ist der praktische Wert ("was macht es?"), #pragma hdrstop (kein Dateiname-Parameter) in ein paar Quelldateien (cpp) zu setzen?

Beachten Sie, dass die MSDN-Dokumentation (noch einmal ) so klar wie Schlamm für mich.

Bearbeiten / Hinweis: Ich frage das, weil diese Antwort und der Artikel, den es verlinkt, scheinen das zu empfehlen. Aber ich verstehe nicht, welchen Vorteil es hat, eine separate PCH-Datei für jede Kompilierungseinheit zu haben.

    
Martin Ba 02.09.2011, 11:38
quelle

3 Antworten

10

Die Antwort auf die ursprüngliche Frage ist, dass der Zweck von #pragma hdrstop in einer Datei ohne / Yc oder / Yu ist, dass sie ignoriert wird und Sie können eine Build-Konfiguration einrichten, die ohne vorkompilierte Header und andere Builds erstellt Konfigurationen, die WITH vorkompilierte Header erstellen, und Sie müssen den Code oder die Header, die überhaupt enthalten sind, nicht ändern, um dies zu tun.

Mehr Details ...

Die Anmerkungen auf MSDN sagen, dass "das hdrstop-Pragma Ihnen zusätzliche Kontrolle über Vorkompilierungsdateinamen und über den Speicherort gibt, an dem der Kompilierungsstatus gespeichert wird". Das stimmt, aber es ist nicht besonders offensichtlich, wie nützlich das sein kann ...

Auf den Punkt gebracht.

  • Das Einfügen von #pragma hdrstop in eine Quelldatei, die nicht mit / Yc oder / Yu kompiliert wurde, hat überhaupt keinen Effekt.
  • Wenn Sie / Yu für die Datei festgelegt haben, weist hdrstop den Compiler an, alles vor der Zeile, auf der hdrstop erscheint, wegzuwerfen und stattdessen den vorkompilierten Header einzufügen.
  • Wenn / Yc für die Datei festgelegt ist, bedeutet hdrstop, dass der gesamte kompilierte Status für alles bis zu der Zeile gespeichert wird, auf der hdrstop als vorkompilierter Header angezeigt wird.

Der Trick ist die Verwendung von / Yc und / Yu ohne den optionalen Header-Dateinamen; Aktivieren Sie einfach das Optionsfeld "Verwenden" oder "Erstellen" und lassen Sie das Eingabefeld "Über Kopfzeile" leer (oder bearbeiten Sie die Projektdatei ...).

Sie haben also 1 Datei, möglicherweise PrecompiledHeader.cpp genannt, die die Header enthält, die Sie in den vorkompilierten Header aufnehmen wollen und die #pragma hdrstop am Ende der Liste der Include-Dateien haben. Diese ONE-Datei wird mit / Yc kompiliert.

Sie haben dann alle anderen cpp-Dateien mit #pragma hdrstop nach den Include-Dateien, die sich in Ihrem vorkompilierten Header befinden. Diese Dateien sind alle mit / Yu kompiliert.

Dies führt dazu, dass PrecompiledHeader.cpp Ihre (in diesem Beispiel) einzelne pch-Datei und alle anderen Dateien mit dieser einzelnen pch-Datei erstellt.

Der Vorteil dabei ist, dass KEINE Ihrer Dateien eine 'globale' vorkompilierte Header-Header-Datei enthalten muss - also keine stdafx.h oder was auch immer. Dies bedeutet, dass Sie eine Buildkonfiguration einrichten können, die WITHOUT vorkompilierte Header erstellt, wobei alle #pragma-hdrstop-Zeilen einfach ignoriert werden.

Das ist "gut", denn das bedeutet, dass Sie eine einzige "no precomp" -Build-Konfiguration haben, mit der Sie sich schnell entwickeln können (Sie können einen einzelnen Header ändern und NICHT die Welt zum Neuerstellen zwingen) und andere "normale" Konfigurationen Verwenden Sie vorkompilierte Header.

    
Len Holgate 04.07.2013, 12:44
quelle
5

Der gesamte Code vor #pragma hdrstop ist Teil eines vorkompilierten Headers. Wenn kein Dateiname angegeben ist, ist der Name des Headers der Basisname der Quelldatei mit der Erweiterung .PCH, wie in die Dokumentation :

  

Der Name der vorkompilierten Header-Datei wird gemäß der   folgende Regeln in der Reihenfolge ihres Vorrangs:

     
  1. Das Argument für die / Fp-Compileroption

  2.   
  3. Das Dateinamensargument zu #pragma hdrstop

  4.   
  5. Der Basisname der Quelldatei mit der Erweiterung .PCH

  6.   

Wenn Sie also eine Datei namens blah.cpp haben, wird eine Datei mit dem Namen blah.pch erstellt, IFF mit /Yc kompiliert (die nur eine Datei hätte setzen sollen).

    
R. Martinho Fernandes 02.09.2011 11:45
quelle
4

Wenn Sie in Ihrem C / C ++ - Projekt nicht #pragma hdrstop verwenden, benötigen Sie eine dedizierte CPP-Datei als Quelldatei für die erstellte .pch-Datei.

Wenn Sie #pragma hdrstop in einer CPP-Datei verwenden, mit der Sie eine .pch-Datei erstellen möchten, kann die .cpp-Datei nach der Zeile von #pragma hdrstop andere nützliche Inhalte enthalten. Wenn Sie diese .cpp-Datei zum ersten Mal mit der Kompilierungsoption / Yc kompilieren, erhalten Sie die .pch-Datei und die .obj-Datei. Wenn Sie die .cpp-Datei ändern und mit der Kompatibilitätsoption / Yu neu kompilieren, ersetzt der Compiler den Inhalt vor der Zeile von #pragma hdrstop durch die .pch-Datei und kompiliert den Teil nach der Zeile von #pragma hdrstop neu und erstellt eine neue OBJ Datei, Speichern der Übersetzungszeit. Es ist sehr nützlich, dass Ihr Projekt die einzige Quelldatei hat.

Bei Quelldateien, die nur Vorkompilierungsdateien verwenden, ist #pragma hdrstop ein Orientierungspunkt für den Compiler, dessen Teil durch die .pch-Datei ersetzt werden soll. Daher müssen Sie den Header-Dateinamen nicht mit der Option / Yu angeben.

    
ligand 01.07.2013 21:26
quelle