В Objective-C id является typedef:
typedef struct objc_object {
Class isa;
} *id;
Так что я могу объявить (и инициализировать) переменную, например, так:
// using id
id po_one = @"one";
Компилируется нормально.
Поскольку я называю свои типы в собственной схеме, и так как мне не нравится подразумеваемый указатель в идентификаторе typedef, я хочу добавить собственный typedef (с O для объекта), например так:
typedef struct objc_object O;
Так чтоОбъявление переменной (с инициализацией) может выглядеть следующим образом:
// using O
O * po_two = @"two";
Это компилируется с предупреждением:
Инициализация из несовместимого типа указателя
Насколько далекокак я понимаю typedefs, я подумал, что последнее должно быть эквивалентно:
// using struct objc_object
struct objc_object * po_three = @"three";
, что снова прекрасно компилируется.
Удивительно, что:
po_two = po_one;
po_two = po_three;
оба компилируются безПредупреждения.
Поэтому я попытался:
typedef struct objc_object * PO;
, чтобы увидеть, работает ли он без предупреждения, если я включу указатель (это именно то, чего я хочу избежать - так, просто из соображений теста), чтобыпосмотрите, отличаются ли определения типа вне определения структурыПривязка к typedef в определении структуры (в данном случае это определение id).
// using PO
PO po_four = @"four";
Это также отлично работает.
Если я использую:
#define O struct objc_object
конструкция с использованием O снова компилируется без предупреждения.
Но я предпочитаю использовать typedefs вместо определений, когда это возможно.
Я озадачен.В чем мое недопонимание с typedefs?