Einige dieser Präprozessordefinitionen befinden sich in der WinMain-Funktion und anderen Windows-Bibliotheksfunktionen. Was ist ihr Zweck? Wie arbeiten Sie? und ist es empfehlenswert, sie in Ihre Implementierungen oder Funktionsaufrufe zu schreiben?
Meine ersten Recherchen deuten darauf hin, dass sie einfach gleich aufgebaut sind wie:
#define __in
#define __out
#define __in_opt
Das heißt, sie werden durch ersetzt nichts auf dem Präprozessordurchlauf. Sind sie nur eine Dokumentationsmethode ohne jegliche Funktionalität?
Wenn ja, sehe ich den Vorteil, den Code so zu dokumentieren. Bei so etwas wie doxygen müssen Sie die Parameternamen zweimal ausschreiben. Dies könnte also theoretisch dazu beitragen, Doppelarbeit zu reduzieren und die Konsistenz zu wahren …
Ich habe keine Theorie, wie __allowed()
soll funktionieren.
Sie sind SAL-Annotationen in der Source-Code Annotation Language. Microsoft-Tools sind davon abhängig. Der Artikel der MSDN-Bibliothek ist hier. Ein gutes Beispiel ist Code-Analyse. Ein weiteres ziemlich unabhängiges Tool, das jedoch durch diese Anmerkungen unterstützt wird, ist der Pinvoke Interop Assistant.
SAL-Anmerkungen sind für zwei Dinge nützlich:
- Statische Analyse durch PREfast (kompilieren mit /analyze)
- Menschliche Leser können sich die Anmerkungen ansehen und herausfinden, wie eine Funktion aufgerufen werden sollte, und schnell die Eingabe-/Ausgabeparameter bestimmen.
Die Makros werden tatsächlich zu verschiedenen declspec-Ausdrücken erweitert, wenn Ihr Code mit aktivierter Analyse kompiliert wird. Ich verwende diese Anmerkungen ständig in meinem Code.
Sie werden in einem semantischen Analysetool von Microsoft als Code-Markups verwendet. Wenn Sie dieses Tool nicht selbst verwenden möchten, hat es wenig Sinn, es zu verwenden.
Diese Microsoft-Makros werden im Allgemeinen zu nichts erweitert und sind als Hinweise für den Leser gedacht.
Allerdings habe ich letztes Mal zB die Hintings auf der überprüft MessageBox
Argumente war völlig falsch, was darauf hindeutet, dass das erste, zweite und dritte Argument nützliche Standardwerte hatte (wenn Sie 0 angeben), während in Wirklichkeit das erste und vierte Argument nützliche Standardwerte haben. Vielleicht auch das Titelargument, das standardmäßig “Error” lautet, aber ich habe das nie nützlich gefunden. Es ist also nur eine Sache von Microsoft, Hinweise, auf die Sie sich nicht verlassen können und sollten, nur irreführendes visuelles Durcheinander.
Prost & hth.,
12097800cookie-checkWas ist der Zweck von __in __out __in_opt __allowed(), wie funktionieren sie? Sollte ich ähnliche Konstrukte in meinem eigenen Code verwenden?yes