C ++ typedef и struct question - PullRequest
       5

C ++ typedef и struct question

0 голосов
/ 09 августа 2010
typedef struct 
{
    int y;
    int weight;
    struct edgenode * next;
}edgenode;

Этот код выдает ошибку: 'edgenode' : redefinition; different basic types

Он прекрасно работает в коде C.

Почему?

Ответы [ 4 ]

7 голосов
/ 09 августа 2010

Потому что у вашей структуры нет имени! Вопрос предполагает наследие Си - код написан так, как я бы его написал.

Чистое решение C ++:

struct edgenode
{
    int       y;
    int       weight;
    edgenode *next;
};

Это не будет работать в C. В C, и в соответствии с вопросом, вы написали бы:

typedef struct edgenode
{
    int y;
    int weight;
    struct edgenode * next;
} edgenode;

Теперь ваша структура имеет имя - struct edgenode. Конечно, для него также есть typedef - edgenode, но компилятор не знает об этом имени, пока он не достигнет последней точки с запятой (приблизительно). Вы также можете написать:

typedef struct edgenode edgenode;
struct edgenode
{
    int       y;
    int       weight;
    edgenode *next;
};
0 голосов
/ 09 августа 2010

Разница между C и C ++ заключается в том, что они по-разному обрабатывают имена struct-names и typedef. В C вы не можете ссылаться на структуру без использования ключевого слова "struct" , если только не создаст имя typedef, которое разрешается в имя структуры. Следовательно, это действительно в C, но не в C ++:

struct A {};
typedef int A;

int main()
{
 A a; 
 struct A a; 
}

структуры и typedefs живут в другом пространстве имен, если хотите. Однако в C ++ имена struct и typedef входят в одно и то же пространство имен. Может быть только one A, и поэтому этот пример не компилируется. Так как это относится к вашему примеру? Давайте прочитаем это способом C:

typedef struct                // Here's an unnamed struct
{
    int y;
    int weight;
    struct edgenode * next;  // Oh, yes points to some struct called "edgenode" that we don't know of
}edgenode; // and we want to refer to this structs as "edgenode"

Это объявление фактически создало две вещи, называемые edgenode: typedef (для неназванной структуры) и неполный тип "struct edgenode", который нигде не определен. Вы заметите, что edgenode x; x.next->y не будет компилироваться.

Вот как C ++ читает это:

typedef struct  // Here's an unnamed struct
{
    int y;
    int weight;
    struct edgenode * next;  // Oh, yes points to some struct called "edgenode" that we don't know of
}edgenode; // and we want to refer to this as "edgenode"..HEY WAITASECOND! There's already SOME OTHER THING named edgenode. We know this, because "next" mentioned it!!
0 голосов
/ 09 августа 2010

попробовать:

struct edgenode
{
  int       y;
  int       weight;
  edgenode* next;
};

В C ++ больше не требуется использовать typedef на узлах структуры.
Также способ, которым вы использовали его (для C), был неправильным. если вы напечатаете def, то вам больше не нужно будет использовать struct.

В Си тебе пришлось сделать:

// In C:

struct X {};

struct X a;

// C with typedef (Notice here that the struct is anonymous)
// Thus it is only accessible via the typedef (but you could give it a name)

typedef struct {} X;

X a;

// In C++ the use of struct is no longer required when declaring the variable.

struct Y {};

Y a;
0 голосов
/ 09 августа 2010

Имя не указано для вашей структуры, прежде чем вы напечатаетеdef

typedef struct edgenode
{
    int y;
    int weight;
    edgenode* next;
}en;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...