結構體定義時不寫結構體名會有什麼影響嗎?

比如這個結構體:

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?

TAG:程序員 | 編程 | C編程語言 | STM32 |