Compileroptionen-Makros
Diese Makros steuern bestimmte Compilerfeatures.
Makro | Beschreibung |
---|---|
_ATL_ALL_WARNINGS |
Ein Symbol, das Fehler in Projekten ermöglicht, die aus früheren Versionen von ATL konvertiert wurden. |
_ATL_APARTMENT_THREADED |
Definieren Sie, ob eines oder mehrere Ihrer Objekte Apartmentthreading verwenden. |
_ATL_CSTRING_EXPLICIT_CONSTRUCTORS |
Macht bestimmte CString Konstruktoren explizit, wodurch unbeabsichtigte Konvertierungen verhindert werden. |
_ATL_ENABLE_PTM_WARNING |
Definieren Sie dieses Makro, damit C++-Standardsyntax erforderlich ist. Er generiert den C4867-Compilerfehler, wenn nicht standardmäßige Syntax verwendet wird, um einen Zeiger auf eine Memberfunktion zu initialisieren. |
_ATL_FREE_THREADED |
Definieren Sie, ob eines oder mehrere Ihrer Objekte freie oder neutrale Threading verwenden. |
_ATL_MODULES |
Ermöglicht ihnen das Kompilieren von ATL-Projekten mit eingeschränkter Berechtigung und Verwendung von ATL mit C++-Modulen. |
_ATL_MULTI_THREADED |
Ein Symbol, das angibt, dass das Projekt Objekte als "Both", "Frei" oder "Neutral" markiert hat. Stattdessen sollte das Makro _ATL_FREE_THREADED verwendet werden. |
_ATL_NO_AUTOMATIC_NAMESPACE |
Ein Symbol, das die Standardmäßige Verwendung von Namespace als ATL verhindert. |
_ATL_NO_COM_SUPPORT |
Ein Symbol, das verhindert, dass COM-bezogener Code mit Ihrem Projekt kompiliert wird. |
ATL_NO_VTABLE |
Ein Symbol, das verhindert, dass der vtable-Zeiger im Konstruktor und Destruktor der Klasse initialisiert wird. |
ATL_NOINLINE |
Ein Symbol, das angibt, dass eine Funktion nicht inlineiert werden soll. |
_ATL_SINGLE_THREADED |
Definieren Sie, ob alle Objekte das Einzelthreadingmodell verwenden. |
_ATL_ALL_WARNINGS
Ein Symbol, das Fehler in Projekten ermöglicht, die aus früheren Versionen von ATL konvertiert wurden.
#define _ATL_ALL_WARNINGS
Hinweise
Vor Visual C++ .NET 2002 deaktivierte ATL viele Warnungen und ließ sie deaktiviert, sodass sie nie im Benutzercode angezeigt wurden. Speziell:
C4127-bedingter Ausdruck ist konstant
C4786 'Identifier': Der Bezeichner wurde in den Debuginformationen auf "Zahl"-Zeichen abgeschnitten.
C4201 nicht standardmäßige Erweiterung verwendet : nameless struct/union
C4103 'filename': Verwendet #pragma Pack zum Ändern der Ausrichtung
C4291 "Deklaration": Es wurde kein übereinstimmende Operator gelöscht; Arbeitsspeicher wird nicht freigegeben, wenn die Initialisierung eine Ausnahme auslöst.
C4268 'identifier' : "const" static/global data initialized with compiler-generated default constructor fills the object with zeros
Nicht erreichbarer C4702-Code
In Projekten, die aus früheren Versionen konvertiert wurden, werden diese Warnungen weiterhin von den Bibliothekenheadern deaktiviert.
Um dieses Verhalten zu ändern, fügen Sie der Datei (stdafx.h
in Visual Studio 2017 und früher) die folgende Zeile pch.h
hinzu, bevor Sie Bibliothekenkopfzeilen einschließen.
#define _ATL_ALL_WARNINGS
Wenn dies #define
hinzugefügt wird, achten die ATL-Header darauf, den Status dieser Warnungen beizubehalten, sodass sie nicht global deaktiviert werden (oder wenn der Benutzer explizit einzelne Warnungen deaktiviert, nicht zu aktivieren).
Neue Projekte haben diesen #define
Satz standardmäßig in pch.h (stdafx.h in Visual Studio 2017 und früher).
_ATL_APARTMENT_THREADED
Definieren Sie, ob eines oder mehrere Ihrer Objekte Apartmentthreading verwenden.
_ATL_APARTMENT_THREADED
Hinweise
Gibt Apartmentthreading an. Weitere Optionen und eine Beschreibung der für ein ATL-Objekt verfügbaren Threadingmodelle finden Sie unter Angeben des Threadingmodells und der Optionen des Project-Assistenten für einfache Objekte ATL.
_ATL_CSTRING_EXPLICIT_CONSTRUCTORS
Macht bestimmte CString
Konstruktoren explizit, wodurch unbeabsichtigte Konvertierungen verhindert werden.
_ATL_CSTRING_EXPLICIT_CONSTRUCTORS
Hinweise
Wenn dieser Konstruktor definiert ist, werden alle CString
Konstruktoren, die einen einzelnen Parameter verwenden, mit dem expliziten Schlüsselwort kompiliert, wodurch implizite Konvertierungen von Eingabeargumenten verhindert werden. Dies bedeutet beispielsweise, dass beim Definieren, wenn _UNICODE
Sie versuchen, eine char*
Zeichenfolge als CString
Konstruktorargument zu verwenden, ein Compilerfehler resultiert. Verwenden Sie dieses Makro in Situationen, in denen Sie implizite Konvertierungen zwischen schmalen und breiten Zeichenfolgentypen verhindern müssen.
Mithilfe des _T
Makros für alle Konstruktorzeichenfolgenargumente können Sie Kompilierungsfehler definieren _ATL_CSTRING_EXPLICIT_CONSTRUCTORS
und vermeiden, unabhängig davon, ob _UNICODE
sie definiert sind.
_ATL_ENABLE_PTM_WARNING
Definieren Sie dieses Makro, um die Verwendung von ANSI C++-Standardkonformitätssyntax für Zeiger auf Memberfunktionen zu erzwingen. Wenn Sie dieses Makro verwenden, wird der C4867-Compilerfehler generiert, wenn nicht standardmäßige Syntax verwendet wird, um einen Zeiger auf eine Memberfunktion zu initialisieren.
#define _ATL_ENABLE_PTM_WARNING
Hinweise
Die ATL- und MFC-Bibliotheken wurden so geändert, dass sie der verbesserten C++-Standardkonformität des Microsoft C++-Compilers entsprechen. Gemäß dem ANSI C++-Standard sollte die Syntax eines Zeigers auf eine Klassenmememmfunktion lauten &CMyClass::MyFunc
.
Wenn _ATL_ENABLE_PTM_WARNING
nicht definiert ist (Standardfall), deaktiviert ATL/MFC den C4867-Fehler in Makrozuordnungen (insbesondere Meldungszuordnungen), sodass Code, der in früheren Versionen erstellt wurde, weiterhin wie zuvor erstellt werden kann. Wenn Sie definieren _ATL_ENABLE_PTM_WARNING
, sollte Ihr Code dem C++-Standard entsprechen.
Die nicht standardmäßige Form ist jedoch veraltet. Sie müssen vorhandenen Code in die C++-Standardsyntax verschieben. Beispielsweise folgender Code:
BEGIN_MESSAGE_MAP(CMFCListViewDoc, CDocument)
ON_COMMAND(ID_MYCOMMAND, OnMycommand)
END_MESSAGE_MAP()
Änderung erforderlich in:
BEGIN_MESSAGE_MAP(CMFCListViewDoc, CDocument)
ON_COMMAND(ID_MYCOMMAND, &CMFCListViewDoc::OnMycommand)
END_MESSAGE_MAP()
Fügen Sie für Kartenmakros das kaufmännische Und-Zeichen "&" hinzu. Sie sollten das Zeichen nicht erneut in Ihrem Code hinzufügen.
_ATL_FREE_THREADED
Definieren Sie, ob eines oder mehrere Ihrer Objekte freie oder neutrale Threading verwenden.
_ATL_FREE_THREADED
Hinweise
Gibt freie Threading an. Free Threading entspricht einem Multithread-Apartmentmodell. Eine Beschreibung der für ein ATL-Objekt verfügbaren Threadingmodelle finden Sie unter Angeben des Threadingmodells für andere Threadingoptionen und Optionen, den ATL-Assistenten für einfache Objekte.
_ATL_MODULES
Ermöglicht ihnen, ATL-Projekte mit permissive-
C++-Modulen zu kompilieren und zu verwenden.
_ATL_MODULES
_ATL_MULTI_THREADED
Ein Symbol, das angibt, dass das Projekt Objekte enthält, die als "Beide", "Frei" oder "Neutral" gekennzeichnet sind.
_ATL_MULTI_THREADED
Hinweise
Wenn dieses Symbol definiert ist, ruft ATL Code ab, der den Zugriff auf globale Daten ordnungsgemäß synchronisiert. Neuer Code sollte stattdessen das entsprechende Makro _ATL_FREE_THREADED
verwenden.
_ATL_NO_AUTOMATIC_NAMESPACE
Ein Symbol, das die Standardmäßige Verwendung von Namespace als ATL verhindert.
_ATL_NO_AUTOMATIC_NAMESPACE
Hinweise
Wenn dieses Symbol nicht definiert ist, einschließlich atlbase.h
der standardmäßigen Ausführung using namespace ATL
, was zu Benennungskonflikten führen kann. Um dies zu verhindern, definieren Sie dieses Symbol.
_ATL_NO_COM_SUPPORT
Ein Symbol, das verhindert, dass COM-bezogener Code mit Ihrem Projekt kompiliert wird.
_ATL_NO_COM_SUPPORT
ATL_NO_VTABLE
Ein Symbol, das verhindert, dass der vtable-Zeiger im Konstruktor und Destruktor der Klasse initialisiert wird.
ATL_NO_VTABLE
Hinweise
Wenn der vtable-Zeiger daran gehindert wird, im Konstruktor und Destruktor der Klasse initialisiert zu werden, kann der Linker die vtable und alle Funktionen beseitigen, auf die sie verweist. Erweitert bis __declspec(novtable)
.
Beispiel
class ATL_NO_VTABLE CMyClass2 :
ATL_NOINLINE
Ein Symbol, das angibt, dass eine Funktion nicht inlineiert werden soll.
ATL_NOINLINE inline
myfunction()
{
...
}
Parameter
myfunction
Die Funktion, die nicht inlineiert werden soll.
Hinweise
Verwenden Sie dieses Symbol, wenn Sie sicherstellen möchten, dass eine Funktion nicht vom Compiler inline eingelinet wird, obwohl sie als Inline deklariert werden muss, damit sie in einer Headerdatei platziert werden kann. Erweitert bis __declspec(noinline)
.
_ATL_SINGLE_THREADED
Definieren, ob alle Objekte das Einzelthreadingmodell verwenden
_ATL_SINGLE_THREADED
Hinweise
Gibt an, dass das Objekt immer im primären COM-Thread ausgeführt wird. Eine Beschreibung der für ein ATL-Objekt verfügbaren Threadingmodelle finden Sie unter Angeben des Threadingmodells für andere Threadingoptionen und Optionen, den ATL-Assistenten für einfache Objekte.