簡體   English   中英

C與C ++中的struct和typedef

[英]struct and typedef in C versus C++

我目前正在使用C ++ IDE來處理需要在C上工作的東西,並希望確保稍后我不會遇到問題。 在制作下面的結構后:

typedef struct test {
   int a;
   int b;
};

然后我使用test my_test;創建它的實例test my_test; 那么像my_test.a = 5類的東西......這在我的VStudio C ++中運行良好。 這會在以后的gcc上運行嗎?

我閱讀了相關的問題(我看到我不是第一個有這種問題的人),但似乎沒有人像我這樣做。

實際上, typedef struct {//stuff} test;之間有什么區別typedef struct {//stuff} test; 和我的版本?

typedef struct THIS_IS_A_TAG
{
    int a;
    int b;
} THIS_IS_A_TYPEDEF;

THIS_IS_A_TYPEDEF object1;     // declare an object.       C:Ok,     C++:Ok
struct THIS_IS_A_TAG object2;  // declare another object.  C:Ok,     C++:Ok
THIS_IS_A_TAG object3;         // declare another object.  C:Not Ok, C++:Ok

typedef的原因是因為C程序員希望能夠做到第三件事,但他們不能。

和...之間的不同:

struct Name {};

typedef struct Name {} Name;

是的,在C中,你需要使用:

struct Name instance_name;

對於前者,對於后者,您可以:

Name instance_name;

在C ++中,在任何一種情況下都沒有必要重復struct關鍵字。 請注意,您創建沒有名稱的typedef(即typedef struct Name{}; )的typedef struct Name{};是非標准AFAIK(如果使用關鍵字typedef ,則需要提供一個別名以鍵入該名稱)。

至於最后的變化:

typedef struct { /* ... */ } Name;

上面的代碼創建了一個名為struct的未命名結構。 您可以像使用typedef struct Name { /* ... */ } Name;一樣使用這樣的結構typedef struct Name { /* ... */ } Name; 但是編譯器通常會發出struct的名稱(而不是別名),因此如果你給它一個名字和typedef而不是typedef的匿名結構,你可能會得到更好的涉及結構的錯誤消息。

在C和C ++中,示例構造都是毫無意義的:

typedef struct test {
   int a;
   int b;
};

在C中,這表示存在一個類型struct test ,其中兩個整數作為內容。 如果在大括號' } '和分號'之間有一個名字; ',那么你會從關鍵字typedef獲得一些好處; 就目前而言,關鍵字typedef是多余的,並且(如果設置得足夠繁瑣),GCC會警告你。

在C ++中,這表示存在類型struct test ; 此外,在C ++中,它也創建了一個類型test (在C中不會發生)。 關鍵字typedef仍然可以省略,並且將實現相同的結果。

語法合法; 它沒用,就是這樣。 關鍵字typedef可以在不改變程序含義的情況下省略。

你可以做:

typedef struct test {
   int a;
   int b;
} test;

現在,在C和C ++中,您都有一個類型struct test和一個別名test

暫無
暫無

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

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