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:
%Vor%Fehler C1020: unerwartetes #endif
Wie kann ich diesen Fehler beheben?
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.
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
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:
Eine einfachere Lösung besteht darin, die Argumentnamen einfach zu kommentieren:
%Vor% Wenn wir den Compiler in ' stdafx.h
' umschalten, können wir diesen Fehler vermeiden.
Zum Beispiel können folgende Codezeilen in stdafx.h
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
Tags und Links c++ visual-studio compiler-errors conditional-compilation c++builder