C語言使用巨集初始化結構體的問題

2021-08-05 19:56:12 字數 1263 閱讀 1148

linux核心原始碼中廣泛的使用巨集來進行結構體物件定義和初始化,但是進行物件初始化的時候需要注意巨集引數和結構體成員名衝突的問題,下面進行簡單測試說明,編寫乙個程式建立乙個結構體,然後使用巨集進行結構體初始化:

1

#include "stdio.h"

23 struct guy

4 ;910

#define new_guy(id,name,age) \

11 16

17int main()

18 23

編譯後發現錯誤:

tq@ubuntu

:/mnt/hgfs/vmshare

$ gcc test.c -o tar

test.c:

in function 『main』:

test.c:19:

28:error: expected identifier before numeric constant

struct guy guy1 = new_guy(0,"tangquan",22);

^test.c:12:

3:note:

in definition of macro 『new_guy』

.id = id, \

^test.c:13:

2:error: expected 『}』 before 『.』 token

.name = name, \

^test.c:19:

20:note:

in expansion of macro 『new_guy』

struct guy guy1 = new_guy(0,"tangquan",22);

^tq@ubuntu

:/mnt/hgfs/vmshare

$

單看錯誤我是真沒找到有什麼問題,後來發現巨集引數名和結構體的成員名相同,我猜想巨集展開之後會不會出現奇異,例如12行的「.id = id」會被展開成「.0 = 0」而不是「.id = 0」,所以我將程式的巨集修改了一下巨集引數:

1

#include "stdio.h"

23 struct guy

4 ;910

#define new_guy(_id,_name,_age) \

11 16

17int main()

18 23

修改後編譯無錯,執行正常,不知道問題是不是我猜想的那樣,反正巨集引數名和結構體的成員名不要相同就行了。

C語言結構體初始化

1 2 test.c 3 2018 1 30 4 5 include 6 7 struct studen 12 13 14 15 int main void 16 19 20 number two 先定義再乙個個初始化 21 struct studen std2 22 std2.id 120 23 ...

C語言結構體的初始化

今天在工作時,看到了奇葩的結構體初始化方式,於是我查了一下c99標準文件和gcc的說明文件,終於搞清楚是怎麼回事了。假設有如下結構體定義 typedef struct mystruct 那麼結構體的初始化方式如下有三種 1 c89的初始化方式 mystruct test 這種初始化的優點是語法簡單,...

C 結構體初始化

今天在看mfc結構時,順便看了看 深入淺出mfc 發現有這麼一行 m pmainwnd new cmyframewnd 乍一看,很正常啊,再仔細一看,貌似 new cmyframewnd 的時候少了一對括號。奇怪!之後又翻了翻書,發現好多處都是這樣的。難道我弄錯了,不可能啊,一般情況下在new乙個新...