w celu C id jest typedef:Objective-C; typedef objc_object jako substytut id bez wskaźnika;
typedef struct objc_object {
Class isa;
} *id;
Mogę więc stwierdzenie, (i zainicjować) zmienną np tak:
// using id
id po_one = @"one";
Kompiluje dobrze.
Odkąd wymienić moje typy na własnym systemie, a ponieważ lubię domniemaną wskaźnik w id typedef chcę dodać własny typedef (z O do obiektu) tak:
typedef struct objc_object O;
więc zmienną deklaracja (z inicjalizacji) mógłby wyglądać następująco:
// using O
O * po_two = @"two";
To kompiluje z ostrzeżeniem:
inicjalizacja od I ncompatible wskaźnik typ
O ile mi zrozumieć typedefs myślałem, że ta ostatnia powinna być równa:
// using struct objc_object
struct objc_object * po_three = @"three";
Które ponownie kompiluje grzywny.
To zdumiewające, że:
po_two = po_one;
po_two = po_three;
zarówno skompilować bez ostrzeżenia.
Tak próbowałem:
typedef struct objc_object * PO;
aby sprawdzić, czy to działa bez ostrzeżenia, jeśli to wskaźnik (jest dokładnie co chcę uniknąć - tak po prostu ze względów testowych), aby zobaczyć, czy typedef poza definicja struktury działa inaczej niż typedef w definicji struktury (która jest definicją id w tym przypadku).
// using PO
PO po_four = @"four";
To również działa dobrze.
Jeśli używam:
#define O struct objc_object
konstrukt korzystania O ponownie kompiluje bez ostrzeżenia.
Ale wolę używać maszyn typu "typedefs" zamiast definiowania, gdy tylko jest to możliwe.
Jestem zdziwiony. Jakie jest moje nieporozumienie z typedefs?
Który kompilator? – JeremyP
Można również użyć 'NSObject *' zamiast 'O *', np. 'NSObject * po_two = @" two ";', w większości przypadków. –