Ich habe eine Struktur mit einer Callback-Funktion, die Callback-Funktion benötigt einen Zeiger auf die Struktur, um ihre Operation auszuführen. Wie definiere ich diese Elemente richtig, so dass sie ohne Warnungen kompiliert werden?
%Vor%Wenn ich das Attribut "struct" für den Parameter pr lösche, erhalte ich einen Fehler. Wenn ich es verlasse, bekomme ich eine Warnung: "Sein Umfang ist nur diese Definition oder Erklärung, die wahrscheinlich nicht das ist, was Sie wollen"
Es funktioniert alles, aber ich würde gerne wissen, wie man eine solche Struktur richtig definiert.
Ebenfalls verwandt ist die Definition einer selbstreferentiellen Struktur:
%Vor%(Ich denke, das ist richtig, aber zusätzliche Gedanken sind willkommen, wenn sie mit der Frage zusammenhängen.)
Ihr Funktionszeiger verweist auf eine Struktur pr_PendingResponseItem, aber Sie haben keine Struktur pr_PendingResponseItem deklariert. Sie haben nur einen unbenannten Strukturtyp, der auf den Namen pr_PendingResponseItem festgelegt ist (und dieser Name ist noch nicht eingerichtet).
Geben Sie der Struktur einen Namen:
%Vor%Es gibt zwei Möglichkeiten dies zu tun - für beide Beispielstrukturen. Sie sind im Wesentlichen isomorph.
Verwenden Sie ein Struktur-Tag, wie bereits in verschiedenen anderen Antworten gezeigt.
%Vor% Verwenden Sie typedef
, um einem unvollständigen Strukturtyp einen Namen zu geben, und verwenden Sie typedef
in der Strukturdefinition.
Beachten Sie, dass sich die Struktur-Tags in einem anderen Namensraum befinden als die typedef
-Namen. Daher müssen für das typedef
- und das Struktur-Tag keine anderen Namen verwendet werden. Beachten Sie auch, dass in C ++ das typedef
nicht notwendig wäre.
Hinzufügen der Antwort durch nos oben.
Die wichtigste Erkenntnis hier ist, dass Sie bei einer Deklaration wie "typedef struct name1 {} name2;" tatsächlich zwei Typen deklarieren, d. h. " struct name1 {};" und dann "typedef struct name1 name2 ;" wobei struct name1 ein Typ ist und Sie die Syntax "struct name1" verwenden müssen, um darauf zu verweisen, und " name2 "ist ein Typ und Sie bezeichnen ihn als" name2 ". Sie dürfen "name1" auslassen. In diesem Fall definieren Sie einfach den zweiten Typ und der erste bleibt eine anonyme Struktur.
Wenn Sie im ersten Fall auf den Typ "struct pr_PendingResponseItem" verweisen möchten, müssen Sie diesen Typ anstelle der anonymen Struktur deklarieren, die Sie deklariert haben. Ändern Sie daher Ihre Strukturdeklaration in "struct pr_PendingResponseItem".
Im zweiten Fall versuchen Sie, auf einen Struct-Typ als Vorwärtsreferenz zu verweisen (dh auf ihn zu verweisen, bevor seine Definition abgeschlossen ist), was erlaubt ist, aber um auf einen Struct-Typ zu verweisen, die erforderliche Syntax ist Strukturname ". Daher müssen Sie die Vorwärtsverweise auf "LinkedItem_" in Ihrer Definition durch "struct LinkedItem _" ersetzen.
Tags und Links c struct function-pointers