[英]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.