結構體定義時不寫結構體名會有什麼影響嗎?
比如這個結構體:
為什麼不加個結構體名呢?
typedef struct
{
uint16_t GPIO_Pin;
GPIOSpeed_TypeDef GPIO_Speed;
GPIOMode_TypeDef GPIO_Mode;
} GPIO_InitTypeDef;
GPIO_InitTypeDef GPIO_InitStructure;
就是C語言一個語法而已。
- 常見的定義一個struct:
struct tag {
int a;
int b;
} Tag;
這裡的tag只是一個標籤,並不是類型,而struct tag才是一個完整的類型,定義變數需要:
struct tag variable;
而上面的Tag在定義struct結構體的時候定義的一個變數。
- 而題目描述裡面的
typedef struct {
int a;
int b;
}name;
這裡的name是一個struct類型的別名,可以用來直接定義變數,比如:
name variable2;
上面的struct本身是一個匿名的struct。
- 而
typedef struct tag {
int a;
int b;
}name;
相當於先定義struct tag,然後typedef起別名一樣。
可以使用
name variable3;
struct tag variable4;
來定義變數。
題主所問的區別大概就是只typedef而不給tag的話,之後定義變數只能用name而不能用struct tag了。會,我舉個例子
struct Fuck
{
union Shit
{
struct Bitch
{
int a; int b;
};
struct Screw
{
int c; int d;
};
};
};
和
struct Fuck2
{
union
{
struct
{
int a; int b;
};
struct
{
int c; int d;
};
};
};
就完全不是一回事
sizeof(Fuck) == 1
sizeof(Fuck2) == 8
32位VC++
回到題主的問題。因為C語言有個傻逼feature,說的是變數和類型不在同一個namespace的問題。如果你不用typedef的話,你就得到處使用struct GPIO_InitType,struct不能省略,多討厭啊。
贊 @vczh 傳播冷知識。樓主問的問題,如果GPIO_InitTypeDef 這麼用是沒影響的。但如果你在C里 用 struct GPIO_InitTypeDef 去定義結構體,就定義不了了。
先回答問題,
結構體定義時不寫結構體名會有什麼影響嗎?
答:沒影響。
對C語言來說,那個不叫結構體名,而是叫tag。C語言結構體名是struct關鍵字 + tag。因此sizeof(tag)不但是可笑的而且是非法的。至於不寫tag,我個人的體會是取名太難了,有了typedef,就沒必要煞費苦心地為tag取名了。
然後打臉,===============================分割線=============================(待續)==================================================C語言中逗號表達式存在的意義是什麼? - 編程;為什麼C語言整型常量十進位形式的類型與八進位、十六進位的不一樣? - 計算機科學 ;這是一道精妙的題目還是一道傻逼題目? - C(編程語言)。==================================================
物以類聚,來看看輪子的擁躉都是什麼貨色。Warthog
回復 薛非(作者)
C++的struct和C的struct能是一回事嗎?你能在C的struct里寫struct Bitch { Bitch() {
std::cout &<&< "薛非是個山驢逼 "; } }; ?? 所以人家才列出來編譯環境是VC++,避免你這種瞎子挑骨頭。你特么非要把它當成C語言,腦子被驢踢了?
題主的問題裡面的代碼是因為在C中, 定義結構體A後必須用struct A 的形式來引用這個類型名稱。所以不如typedef成一個別名,這樣更簡潔一些。
--------------------------------------------輪子哥的例子僅限VC++。下面說G++。(輪子哥左括弧單起一行,差評
抄襲輪子哥的例子,G++中,定義anonymous struct但不做變數定義,是會編譯錯誤的。
struct{
int a;
int b;
};
好奇怪的語法糖啊。
推薦閱讀:
※C/C++中switch語句為什麼匹配到標籤後不跳出?
※怎麼理解 P 問題和 NP 問題?
※FAQ-開發時需要先完成全部詳細設計/類圖嗎,如果需要那要詳細到什麼程度?
※從接觸編程到工作,你們對編程的認識是一個怎樣的變化過程?
※為什麼C語言的Hello,world都是用printf輸出而不是puts?