Warum müssen Strukturen erzählt werden, wie groß sie sind?

8

Ich habe bemerkt, dass in c / c ++ vielen Win32-API-Strukturen gesagt werden muss, wie groß sie sind. d. h. someStruct.pbFormat = sizeof(SomeStruct)

Warum ist das der Fall? Ist es nur aus Legacy-Gründen? Auch irgendeine Idee, wofür "pb" steht?

EDIT: oops, ja ich meinte "cbFormat"

    
GameTrainersWTF 31.05.2010, 01:11
quelle

5 Antworten

12

Dies ist aus Gründen der Abwärtskompatibilität, wenn Windows-API erweitert wird.

Stellen Sie sich die folgenden Deklarationen vor

%Vor%

was Sie so nennen:

%Vor%

Eine zukünftige OS-Version kann dies auf

erweitern %Vor%

Wenn Sie jedoch mit dem "älteren" SDK kompiliert haben, hat GetWinData keine Chance herauszufinden, was Sie über extraData nicht wissen. Wenn es unabhängig davon gefüllt würde, würden Daten auf dem Stapel überschrieben. BOOOM!

Aus diesem Grund wird die "dem Aufrufer bekannte Größe" zur Struktur hinzugefügt, und am Ende werden neue Elemente angehängt. Die GetWinData -Implementierung kann die Größe überprüfen und entscheiden, dass "dieser arme Kerl noch nicht über alle neuen Funktionen Bescheid weiß".

    
peterchen 31.05.2010, 01:19
quelle
8

Dies ist so, dass die Struktur in zukünftigen Versionen der API erweitert werden kann, und Windows kann dann (durch die Größe des Anrufers) wissen, welche Felder betrachtet werden sollen oder nicht. Es ist im Grunde eine grobe Form der API-Versionierung.

Normalerweise wird diesen Zählbytes das Präfix cb vorangestellt, was für "Anzahl der Bytes" steht. Zum Beispiel beginnt die Struktur STARTUPINFO mit:

%Vor%

Dies wurde irgendwann mit der STARTUPINFOEX Struktur, die den gleichen ersten Teil aber eine andere Größe enthält. Abhängig vom Wert von cb weiß Windows, ob das neue lpAttributeList -Feld angezeigt werden soll oder nicht.

    
Greg Hewgill 31.05.2010 01:13
quelle
1

Der pb ist ein Beispiel für Ungarische Notation , im Grunde ein Schema zum Kodieren eines Variablentyps in seinen Namen.

p>     
Dave Kilian 31.05.2010 01:16
quelle
1

Da die Win32-API eine C API ist - nicht C ++, sind objektorientierte Methoden zur Erweiterung der API nicht verfügbar. Mit der C ++ - API würde eine neue Funktion eine Struktur verwenden, die von der älteren abgeleitet ist, und eine Schnittstelle aufrufen, die die Basisstruktur übernimmt und die Typsicherheit gewährleistet.

C ist eine prozedurale Sprache und ist begrenzter in dem, was Sie mit Strukturen tun können.

    
Igor Zevaka 31.05.2010 01:19
quelle
0

So dass zukünftige Versionen zusätzliche Felder hinzufügen können und immer noch Rückwärts-Binärkompatibilität bieten können:

%Vor%     
R Samuel Klatchko 31.05.2010 01:16
quelle

Tags und Links