Durch Clang erweiterte C++-Compiler

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu Compiler für C++


Die neueste Generation der C++-Compiler von RAD Studio basiert auf dem Open Source Clang-Compiler, der als Frontend für das LLVM-Compiler-Backend dient.

RAD Studio stellt die folgenden C++-Compiler, die durch Clang erweitert wurden, bereit:

Compiler Plattform Clang-Version LLVM-Version
BCC32C 32-Bit-Windows 3.3 3.3
BCC32X [1] 32-Bit-Windows 3.3 3.3
BCC64 64-Bit-Windows 3.3 3.3
BCCIOSARM 32-Bit-iOS 3.3 3.3
BCCIOSARM64 64-Bit-iOS 3.3 3.5
BCCAARM Android 3.3 3.3
  1. BCC32X verwendet Befehlszeilen-Flags von Clang. Dadurch wird die Kompatibilität zu anderen Clang-basierten Compilern (BCC64, BCCIOSARM, BCCIOSARM64 und BCCAARM) hergestellt. BCC32C ist mit den klassischen Compiler-Flags (BCC32) kompatibel.

Unterschiede zwischen C++-Compilern, die durch Clang erweitert wurden, und C++-Compilern der vorherigen Generation

Durch Clang erweiterte C++-Compiler setzen auf einer vollkommen neuen Codebasis auf, und sie unterscheiden sich erheblich von den C++-Desktop-Compilern von RAD Studio der vorherigen Generation:

Im Folgenden finden Sie einige wichtige Unterschiede zwischen C++-Compilern, die durch Clang erweitert wurden, und den beiden C++-Compilern der vorherigen Generation:

  • Durch Clang erweiterte C++-Compiler arbeiten auch als Präprozessoren, wenn sie mit der Option -E ausgeführt werden.
    Für 64-Bit-Windows steht auch ein separater CPP64.EXE-Präprozessor zur Verfügung.
  • Durch Clang erweiterte C++-Compiler aktivieren eine zweiphasige Template-Suche.
    Namen, die nicht an einen abhängigen Typ gebunden sind, werden in der ersten Phase (vor der Instantiierung) gesucht und könnten zu Fehlern führen, die von C++-Compilern der vorherigen Generation nicht gemeldet wurden. In der zweiten Phase (Instantiierung) wird der Template-Code erneut gesucht, um sicherzustellen, dass alle Aufrufe für abhängige Typen gültig sind. Weitere Informationen finden Sie unter Two-phase name lookup for Clang (EN).

Zum Beispiel: Das Template könnte Aufrufe von Funktionen durchführen, die für diesen bestimmten Typ nicht vorhanden sind.

  • Durch Clang erweiterte C++-Compiler lassen Standardargumente nur in Funktionsdeklarationen zu.
    C++-Compiler der vorherigen Generation lassen Standardargumente auch in Funktionszeigern oder Closure-Deklarationen zu.
  • Durch Clang erweiterte C++-Compiler lassen die Verwendung von sizeof in einer Präprozessordirektive, wie #if sizeof(ATypeName) > 20, nicht zu.
  • Durch Clang erweiterte C++-Compiler sind bei Konvertierungen strikter.
    Das Konvertieren von String-Konstanten in char* erzeugt beispielsweise eine Warnung (Konvertierungen von String-Literalen in char * sind veraltet). Andererseits führt die Initialisierung von char* mit unsigned char* zu einem Fehler (eine Variable vom Typ "char *" kann nicht mit einem R-Wert vom Typ BYTE *, auch als unsigned char * bezeichnet, initialisiert werden).
  • Durch Clang erweiterte C++-Compiler lassen das Vermischen von __try mit catch nicht zu: und zwar, weil catch mit try und __try mit __except und/oder __finally verwendet werden muss.
  • Unicode-Bezeichner werden von C++-Compilern, die durch Clang erweitert wurden, nicht unterstützt.
  • CPP32 unterstützt die Option -Hp und gibt Header-Guard-Informationen aus, die vom Experten für vorcompilierte Header verwendet werden.
  • Der Unix-Stil #line entspricht nicht dem Standard-#line von CPP32 usw.
  • Durch Clang erweiterte C++-Compiler unterstützen die C++-Attribute final, deprecated und noreturn nicht. Unter Workaround für C++11-Attribute finden Sie einen Workaround für C++-Compiler, die durch Clang erweitert wurden.
  • Viele Optionen der C++-Compiler der vorherigen Generation werden von C++-Compilern, die durch Clang erweitert wurden, nicht unterstützt und umgekehrt:
  • Durch Clang erweiterte C++-Compiler behandeln __FUNC__ nicht als vordefiniertes Makro, sondern als vordefinierten Bezeichner (vordefinierte funktionsbezogene Variable), der Funktionsnamen als statisches char-Array erfasst.

Weitere Informationen finden Sie unter Unterschiede zwischen C++-Compilern, die durch Clang erweitert wurden, und C++-Compilern der vorherigen Generation.

Umsetzung von Optionen der C++-Compiler der vorherigen Generation in Optionen von C++-Compilern, die durch Clang erweitert wurden

Siehe Von C++-Compilern, die durch Clang erweitert wurden, unterstützte Projektoptionen.

Allgemeine Probleme beim Compilieren eines C++-Compiler-Projekts der vorherigen Generation mit C++-Compilern, die durch Clang erweitert wurden

Sie werden wahrscheinlich aufgrund der ANSI-konformen Genauigkeit von C++-Compilern, die durch Clang erweitert wurden, auf neue Fehler stoßen.

Weitere Informationen finden Sie unter:

Unterstützung für vorcompilierte Header

Durch Clang erweiterte C++-Compiler unterstützen vorcompilierte Header, die standardmäßig den Namen <Projekt><n>PCH.h erhalten.

Weitere Informationen finden Sie unter Verwenden von vorcompilierten Headern mit C++-Compilern, die durch Clang erweitert wurden.

Vordefinierte Makros

Es gibt zahlreiche, von den Compilern, die durch Clang erweitert wurden, unterstützte vordefinierte Makros. BCCIOSARM unterstützt beispielsweise "Defines", wie __APPLE__ und __BCCPLUSPLUS__.

In der Befehlszeilenoberfläche Ihres Compilers können Sie alle unterstützten, vordefinierten Makros folgendermaßen anzeigen:

echo | <compiler> -E -dM -

Die Option -E führt nur den Präprozessor aus. -dM gibt einen Dump aller während der Vorverarbeitung definierten Makros aus und hält dann an. Das abschließende - übernimmt die Eingabe von stdin, die durch die Pipe vom leeren echo gesendet wurde.

Weitere Informationen finden Sie unter Vordefinierte Makros.

Schlüsselwörter

Dieser Abschnitt enthält eine alphabetische Liste aller C++-Schlüsselwörter, für die eine besondere Behandlung erforderlich ist, wenn sie mit C++-Compilern, die durch Clang erweitert wurden, verwendet werden oder von diesen Compilern nicht unterstützt werden.

Unterstützt Nicht unterstützt

Unter Workaround für C++11-Attribute (Durch Clang erweiterte C++-Compiler) wird erläutert, wie Sie die Funktionalität von Schlüsselwörtern ersetzen, die nicht von C++-Compilern, die durch Clang erweitert wurden, unterstützt werden.

Die automatische Referenzzählung ist möglicherweise standardmäßig aktiviert

Die LLVM-basierten Delphi-Compiler verwenden die automatische Referenzzählung (Automatic Reference Counting, ARC). Der Delphi-Compiler für eine bestimmte Zielplattform basiert auf LLVM, der entsprechende C++-Compiler, der durch Clang erweitert wurde, aktiviert ARC automatisch. Das Aktivieren von ARC entspricht der Übergabe der Option -fborland-auto-refcount an die Befehlszeilenoberfläche des C++-Compilers.

In der folgenden Tabelle ist aufgeführt, bei welchen C++-Compilern, die durch Clang erweitert wurden, ARC standardmäßig aktiviert ist:

Plattform Delphi-Compiler C++-Compiler ARC standardmäßig aktiviert

32-Bit-Windows

DCC32

BCC32C

Nein

64-Bit-Windows

DCC64

BCC64

Nein

32-Bit-iOS

DCCIOSARM

BCCIOSARM

Ja

64-Bit-iOS

DCCIOSARM64

BCCIOSARM64

Ja

Android

DCCAARM

BCCAARM

Ja

Hinweis: Deaktivieren Sie ARC nicht in der Befehlszeile. ARC ist für die Arbeit mit den FireMonkey- und RTL-Frameworks erforderlich.}}

Verwenden der parallelen Compilierung

Die parallele Compilierung ermöglicht, dass Compiler mehrere Quelltextdateien durch Verwenden von separaten Kernen des Systemprozessors gleichzeitig verarbeiten können, um die Dauer der Compilierung signifikant zu reduzieren.

Um die parallele Compilierung in der IDE für ein bestimmtes C++-Projekt zu aktivieren, öffnen Sie das Zielprojekt, und führen Sie die folgenden Schritte aus:

  1. Wählen Sie Projekt > Optionen > C++-Compiler, und aktivieren Sie unter Allgemeine Compilierung die Option "Stapel-Compilierung aktivieren".
  2. Wählen Sie Projekt > Optionen > Projekteigenschaften und:
    1. Aktivieren Sie die Option "C++-Compiler in separatem Prozess ausführen".
    2. Wählen Sie die Anzahl der parallelen Unterprozesse aus, die Sie verwenden möchten.
      Hinweis: Die Anzahl der Unterprozesse, die Sie auswählen, darf nicht größer als die Anzahl der CPU-Kerne sein.

Themen

Siehe auch