typedefs über mehrere Header-Dateien bekannt machen

  • Nun, woran mag es dann liegen, dass nach Beseitigung des Importloop diese Fehler verschwinden?
    StackOverflow scheint dieses Verhalten auch zu kennen.
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
  • So ist es, ihr habt beide Recht. Michael insoweit, als dass keine Import-Loop besteht, Lucas insoweit, als dass wechselseitige Imports nicht gehen. (Allerdings hat Michael das auch nie bestritten. Er hat also insgesamt Recht.)

    Beispiel
    Klasse A benutzt Klasse B und Klasse B benutzt Klasse A. Beide importieren sich wechselseitig:

    Quellcode

    1. // A.h
    2. #import "B.h" // Brauche ich.
    3. @interface A : …
    4. @property (strong) B *b; // und zwar hier
    5. @end

    Quellcode

    1. // A.m
    2. #import "A.h" // Eigener Import

    Quellcode

    1. // B.h
    2. #import "A.h" // Brauche ich.
    3. @interface B : …
    4. @property (strong) A *a; // und zwar hier
    5. @end

    Quellcode

    1. // B.m
    2. #import "B.h" // Eigener Import


    Das sieht aus wie eine Import-Loop, ist auch eine (wie Lucas sagt), führt aber nicht zu ewigen wechselseitigen Importen, sondern zu einem Fehler (Michael). Warum? Gehen wir das mal durch. Wir kompilieren einfach mal A. Dabei passiert folgendes
    Der Code von A.m

    Quellcode

    1. // A.m
    2. #import "A.h" // Eigener Import

    expandiert A.h einmalig, so dass er jetzt so aussieht

    Quellcode

    1. // A.m
    2. // #import "A.h" expandiert
    3. // A.h
    4. #import "B.h" // Brauche ich.
    5. @interface A : …
    6. @property (strong) B *b; // und zwar hier
    7. @end

    In dem nächsten Schritt wird jetzt der Import von B.h (einmalig) expandiert. Heraus kommt

    Quellcode

    1. // A.m
    2. // #import "A.h" expandiert
    3. // A.h
    4. // #import "B.h" // Brauche ich.
    5. // B.h
    6. #import "A.h" // Brauche ich.
    7. @interface B : …
    8. @property (strong) A *a; // und zwar hier
    9. @end
    10. @interface A : …
    11. @property (strong) B *b; // und zwar hier
    12. @end
    Alles anzeigen

    Jetzt passiert genau das, was Michael sagt: A.h, soeben wieder aufgetaucht, wird nicht mehr expandiert. Es bleibt also so. Was der Compiler also übersetzt, ist:

    Quellcode

    1. @interface B : …
    2. @property (strong) A *a;
    3. @end
    4. @interface A : …
    5. @property (strong) B *b;
    6. @end

    Dies führt zu der /Fehlermeldung/ (wie Michael sagt), dass die Property von a von B nicht übersetzt werden kann, weil die Klasse A unbekannt ist.

    Quellcode

    1. @interface B : …
    2. @property (strong) A *a; // Fehler!
    3. @end
    4. @interface A : …
    5. @property (strong) B *b;
    6. @end
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?