В С , это:
struct abc
{
int a1;
int b1;
};
создает тип struct abc
(грубо говоря), но не тип abc
.
Вот почему вы используете трюк typedef
для создания типа, который мы можем использовать без необходимости писать struct
везде:
typedef struct abc{
int a1;
int b1;
} abc_t;
Теперь у вас также есть тип abc_t
, который совпадает с struct abc
. Все еще нет типа abc
.
Поэтому, когда вы добавляете объявление указателя с именем abc
, это действительно, так как имя еще не занято.
В C ++ исходное объявление создает тип с именем abc
. Нет необходимости в приеме typedef
, и ваше объявление указателя с именем abc
недопустимо, поскольку взято имя abc
.
Решение
Вы можете устранить неоднозначность своих имен (и де-запутать код) следующим образом:
struct abc
{
int a1;
int b1;
};
typedef struct abc abc_t;
abc_t* ptr_to_abc;
Или, если вы пишете на C ++ и не нуждаетесь в C-компате, просто так:
struct abc
{
int a1;
int b1;
};
abc* ptr_to_abc;