anonymous structs匿名結構體

在Keil上編程時這樣一個union

typedef union CDATE {
	uint16_t value;
	struct {
		uint16_t	reserved : 1;
		uint16_t	day : 5;	// day: 0-30, 0=1st, 1=2nd, ...
		uint16_t	month : 4;	// month: 0-11, 0=JANURAY, 1=FEBRARY, ...
		uint16_t	year : 6;	// year: 0-63, 0=TIM_YEAR_BASE
	};
} CDATE;

編譯器報錯:error:  #3093: anonymous structs are only supported in –gnu mode, or when enabled with #pragma anon_unions

默認設置無法使用匿名結構體,解決的辦法:

  1. 給結構體添加名字,比如day,但是使用的時候就必須鍵入這個名字,比如:
    typedef union CDATE {
    	uint16_t value;
    	struct {
    		uint16_t	reserved : 1;
    		uint16_t	day : 5;		// day: 0-30, 0=1st, 1=2nd, ...
    		uint16_t	month : 4;	// month: 0-11, 0=JANURAY, 1=FEBRARY, ...
    		uint16_t	year : 6;		// year: 0-63, 0=TIM_YEAR_BASE
    	}date;
    } CDATE;
    CDATE date;
    date.date.day = 1;

  2. 在Misc Controls中添加–gnu
  3. 在code中添加#pragma anon_unions

後兩種方法都不需要加入結構體名字,使用時會比較方便,比如:

CDATE date;
date.day = 1;

我在使用第二種方法編譯時STM32的hal driver出現了警告,別小瞧了警告,有時候系統功能不正常可能就是某個警告引起的,爲了避免可能出現的問題,還是選擇了第三種方法。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章