簡體   English   中英

C ++ typedef和struct問題

[英]C++ typedef and struct question

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

這段代碼給出了錯誤: 'edgenode' : redefinition; different basic types 'edgenode' : redefinition; different basic types

它在C代碼中可以正常工作。

為什么?

因為您的結構沒有名字! 這個問題暗示了C的傳統-代碼是按照我編寫代碼的方式編寫的。

純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;
};

在鍵入def之前沒有為結構指定名稱

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

嘗試:

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

在C ++中,不再需要在結構節點上使用typedef。
同樣,您使用它(對於C語言)的方式也是錯誤的。 如果您鍵入typedef,則不再需要使用struct。

在C中,您必須執行以下操作:

// 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;

C和C ++之間的區別在於,它們以不同的方式對待struct-names和typedef name。 在C語言中, 除非您創建可解析為結構名稱的typedef名稱, 否則您不能在不使用“ struct”關鍵字的情況下引用該結構。 因此,這在C中有效,但在C ++中無效:

struct A {};
typedef int A;

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

如果需要的話,struct和typedef可以位於不同的命名空間中。 但是,在C ++中,結構名稱和typedef名稱都進入同一名稱空間。 只能有一個 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)和一個不完整的“ struct edgenode”類型,該類型在任何地方都沒有定義。 您會注意到edgenode x; x.next->y 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!!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM