Warum bekomme ich Kompilierungsfehler, nachdem ich stdafx.h bedingt übernommen habe?

7

Ich versuche ein Programm zu schreiben, das in Borland C ++ und Visual C ++ kompiliert. Dazu füge ich #ifdef _MSC_VER hinzu, um die Datei stdafx.h einzuschließen, wenn die Quelle unter VS kompiliert wird. Der Code kompiliert und führt OK in Borland C ++ aus, aber in VS schlägt es fehl:

  

Fehler C1020: unerwartetes #endif

%Vor%

Wie kann ich diesen Fehler beheben?

    
Salvador 18.10.2011, 02:07
quelle

4 Antworten

11

Die Art, wie MSVC vorkompilierte Header implementiert, ist im Grunde, dass der Compiler alles bis auf die Zeile ignoriert, die den vorkompilierten Header einbringt, und von vorne beginnt. Wenn Sie also Ihr Programm kompilieren, "erinnert" es sich nicht an die #ifdef -Zeile, so dass die #endif -Zeile keinen Sinn ergibt.

Die Sache ist, es gibt nichts inhärent "MS" über stdafx.h , jenseits des eigentümlichen Benennungsschemas [welches Sie sowieso ändern können]. Warum also die Blockierung der Inklusion in Borland? Im schlimmsten Fall verschieben Sie den Block _MSC_VER in die Kopfzeile, und Sie befinden sich in derselben Situation, in der Sie sich jetzt befinden, außer dass eine einzelne verschwendet Include-Datei vorhanden ist. Oder Sie lassen Ihr Buildsystem #include auf eine Borland-spezifische stdafx.h -Datei umleiten.

    
Dennis Zickefoose 18.10.2011, 03:08
quelle
2

Dies muss ein vorkompilierter Header-Feature-Effekt sein. Die einfache Lösung besteht darin, sie in VS-Projekteinstellungen zu deaktivieren. Das Problem ist, der Compiler setzt seinen Zustand zurück, wenn er auf das

stößt %Vor%

-Zeile zu dem in der vorkompilierten Header-Datei gespeicherten Zustand. So wird die #ifdef... -Zeile zu ignored und #endif -Zeile verursacht Compilerfehler

    
Pavel Zhuravlev 18.10.2011 02:36
quelle
0

Andere kommentierten das PCH-Problem. In Borland muss #pragma argsused an eine Funktion angehängt werden. Sein Zweck besteht darin, dem Compiler eine Single zu geben, dass die Argumente der Funktion nicht von dem Funktionskörper verwendet werden, so dass er keine Warnungen "unbenutztes Argument" ausgibt. Daher können Sie #pragma hdrstop und #pragma argsused nicht im selben #ifdef -Block gruppieren. Sie müssen sie trennen, zB:

%Vor%

Eine einfachere Lösung besteht darin, die Argumentnamen einfach zu kommentieren:

%Vor%     
Remy Lebeau 18.10.2011 06:23
quelle
0

Wenn wir den Compiler in ' stdafx.h ' umschalten, können wir diesen Fehler vermeiden.  Zum Beispiel können folgende Codezeilen in stdafx.h

definiert werden %Vor%

Sie können pragma once oder traditionelle Header-Wachen innerhalb dieses Makros wie erwartet ändern. Daher können wir stdafx.h mit jedem C / C ++ - Compiler erstellen, da wir unsere bedingte Makroanweisung into the stdafx.h

portieren     
user9411335 26.02.2018 09:18
quelle