Windows Codierungskonventionen

Wenn Sie noch nicht mit Windows arbeiten, kann es versirrend sein, wenn Sie zum ersten Mal ein Windows sehen. Der Code ist mit ungewöhnlichen Typdefinitionen wie DWORD _ PTR und LPRECT gefüllt, und Variablen verfügen über Namen wie hWnd und pwsz (als "Ink malische Notation" bezeichnet). Es lohnt sich, sich einen Moment Zeit zu nehmen, um einige der Windows programmieren zu lernen.

Die überwiegende Mehrheit Windows APIs besteht entweder aus Funktionen oder Component Object Model (COM)-Schnittstellen. Nur sehr wenige Windows-APIs werden als C++-Klassen bereitgestellt. (Eine wichtige Ausnahme ist GDI+, eine der 2D-Grafik-APIs.)

TypeDefs

Die Windows-Header enthalten viele Typedefs. Viele davon sind in der Headerdatei WinDef.h definiert. Hier sind einige, auf die Sie häufig stoßen werden.

Ganzzahltypen

Datentyp Size Unterzeichnet?
BYTE 8 Bit Ohne Vorzeichen
DWORD 32 Bit Ohne Vorzeichen
INT32 32 Bit Signiert
INT64 64 Bit Signiert
LONG 32 Bit Signiert
LONGLONG 64 Bit Signiert
UINT32 32 Bit Ohne Vorzeichen
UINT64 64 Bit Ohne Vorzeichen
ULONG 32 Bit Ohne Vorzeichen
ULONGLONG 64 Bit Ohne Vorzeichen
WORD 16 Bit Ohne Vorzeichen

Wie Sie sehen können, gibt es eine gewisse Redundanz in diesen Typedefs. Ein Teil dieser Überlappung ist einfach auf den Verlauf der Windows-APIs zurück. Die hier aufgeführten Typen haben eine feste Größe, und die Größen sind in 32-Bit- und 64-Anwendungen identisch. Der DWORD-Typ ist beispielsweise immer 32 Bit breit.

Boolescher Typ

BOOL ist ein Typalias für int, der sich von bool von C++ und von anderen Typen, die einen booleschen Wert darstellen, unterscheiden. Die Headerdatei WinDef.h definiert außerdem zwei Werte für die Verwendung mit BOOL.

#define FALSE    0 
#define TRUE     1

Trotz dieser Definition von TRUE können die meisten Funktionen, die einen BOOL-Typ zurückgeben, jeden Wert zurückgeben, der nicht 0 (null) ist, um die boolesche Wahrheit anzugeben. Daher sollten Sie immer dies schreiben:

// Right way.
if (SomeFunctionThatReturnsBoolean()) 
{ 
    ...
}

// or

if (SomeFunctionThatReturnsBoolean() != FALSE)
{ 
    ...
}

und nicht dies:

if (result == TRUE) // Wrong!
{
    ... 
}

BOOL ist ein ganzzahliger Typ und kann nicht mit bool von C++ ausgetauscht werden.

Zeigertypen

Windows definiert viele Datentypen des Formularzeigers auf X. Diese haben in der Regel das Präfix P- oder LP- im Namen. LPRECT ist beispielsweise ein Zeiger auf ein RECT,wobei RECT eine Struktur ist, die ein Rechteck beschreibt. Die folgenden Variablendeklarationen sind gleichwertig.

RECT*  rect;  // Pointer to a RECT structure.
LPRECT rect;  // The same
PRECT  rect;  // Also the same.

In 16-Bit-Architekturen (16-Bit-Windows) gibt es zwei Zeigertypen, P für "Zeiger" und LP für "long pointer". Lange Zeiger (auch als Far-Zeiger bezeichnet) wurden benötigt, um Speicherbereiche außerhalb des aktuellen Segments zu adressieren. Das LP-Präfix wurde beibehalten, um das Portieren von 16-Bit-Code auf 32-Bit-Windows. Heute gibt es keine Unterscheidung, und diese Zeigertypen sind gleichwertig. Vermeiden Sie die Verwendung dieser Präfixe. Oder wenn Sie eine verwenden müssen, verwenden Sie P.

Zeigergenauigkeitstypen

Die folgenden Datentypen weisen immer die Größe eines Zeigers auf, d. &a. 32 Bit Breite in 32-Bit-Anwendungen und 64 Bit Breite in 64-Bit-Anwendungen. Die Größe wird zur Kompilierzeit bestimmt. Wenn eine 32-Bit-Anwendung auf 64-Bit-Windows ausgeführt wird, sind diese Datentypen immer noch 4 Byte breit. (Eine 64-Bit-Anwendung kann nicht auf 32-Bit-Windows ausgeführt werden, sodass die umgekehrte Situation nicht eintritt.)

  • DWORD _ PTR
  • INT _ PTR
  • LONG _ PTR
  • ULONG _ PTR
  • UINT _ PTR

Diese Typen werden in Situationen verwendet, in denen eine ganze Zahl in einen Zeiger konvertiert werden kann. Sie werden auch verwendet, um Variablen für Zeigerarithmetik zu definieren und Schleifenzähler zu definieren, die den gesamten Bytebereich in Speicherpuffern durchlaufen. Im Allgemeinen werden sie an Stellen angezeigt, an denen ein vorhandener 32-Bit-Wert auf 64 Bits auf 64-Bit-Windows.

Notation (Deutsch)

Bei der notieren Notation handelt es sich um das Hinzufügen von Präfixen zu den Namen von Variablen, um zusätzliche Informationen über die Variable zu erhalten. (Der Rausch der Notation, Charles Simonyi, war", daher der Name".

In der ursprünglichen Form liefert die notation -Notation semantische Informationen zu einer Variablen, die Ihnen die beabsichtigte Verwendung angibt. Beispielsweise bedeutet "i" einen Index, "cb" eine Größe in Bytes ("Anzahl von Bytes") und "rw" und "col" die mittleren Zeilen- und Spaltennummern. Diese Präfixe sind so konzipiert, dass die versehentliche Verwendung einer Variablen im falschen Kontext vermieden wird. Wenn Sie beispielsweise den Ausdruck gesehen haben, wissen Sie, dass einer Größe eine Zeilennummer hinzugefügt wird. Dies ist mit sicherheit ein rwPosition + cbTable Fehler im Code.

In einer gängigeren Form der notation -Notation werden Präfixe verwendet, um Typinformationen zu geben, z. B. dw für DWORD und w für WORD.

Hinweis

Die C++ Core Guidelines präfix notation (z.B. Dies ist die notation-Notation). Weitere Informationen finden Sie unter NL.5: Vermeiden von Codierungstypinformationen in Namen. Intern verwendet das Windows diese nicht mehr. Die Verwendung bleibt jedoch in Beispielen und Dokumentationen erhalten.

Nächste

Arbeiten mit Zeichenfolgen