0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

C語言宏定義的使用原理

CHANBAEK ? 來源:嵌入式之入坑筆記 ? 作者:嵌入式之入坑筆記 ? 2023-02-01 14:36 ? 次閱讀

使用STM32開發(fā)的朋友不知道是否有發(fā)現(xiàn)過這樣的一些宏定義? 如下:

#if defined (__CC_ARM)


#pragma anon_unions


#endif

看到上面的語句一開始確實搞不懂為什么要寫這些東西,通過上網(wǎng)去查詢,才搞明白這其中的使用原理。

上面的代碼段我們可以看到兩部分的內容:

1) __CC_ARM

2) #pragma anon_unions

這兩個都有啥用呢? 待我一一道來!

1、__CC_ARM 是 ARM 編譯中的宏選項

__CC_ARM 是一個編譯器的選項,在ARM開發(fā)中根據(jù)開發(fā)環(huán)境的不同,有好幾個可選的宏選項。

這些選項可以查看所開發(fā)的芯片的內核文件,比如我使用的是STM32F407,所以我從 core_cm4.h 文件中可以查閱到:

#if   defined ( __CC_ARM )


#define __ASM __asm /*!< asm keyword for ARM Compiler */


#define __INLINE __inline /*!< inline keyword for ARM Compiler */


#define __STATIC_INLINE static __inline



#elif defined ( __GNUC__ )


#define __ASM __asm /*!< asm keyword for GNU Compiler */


#define __INLINE inline /*!< inline keyword for GNU Compiler */


#define __STATIC_INLINE static inline



#elif defined ( __ICCARM__ )


#define __ASM __asm /*!< asm keyword for IAR Compiler */


#define __INLINE inline /*!< inline keyword for IAR Compiler. Only available in High optimization mode! */


#define __STATIC_INLINE static inline



#elif defined ( __TMS470__ )


#define __ASM __asm /*!< asm keyword for TI CCS Compiler */


#define __STATIC_INLINE static inline



#elif defined ( __TASKING__ )


#define __ASM __asm /*!< asm keyword for TASKING Compiler */


#define __INLINE inline /*!< inline keyword for TASKING Compiler */


#define __STATIC_INLINE static inline



#elif defined ( __CSMC__ )


#define __packed


#define __ASM _asm /*!< asm keyword for COSMIC Compiler */


#define __INLINE inline /*use -pc99 on compile line !< inline keyword for COSMIC Compiler */


#define __STATIC_INLINE static inline



#endif

其中:

(1) __CC_ARM 是對應 ARM RealView 開發(fā)平臺的,它需結合uvision、eclipse或CodeWarrior等開發(fā)環(huán)境來使用的。

(2) ICCARM 是對應 IAR EWARM 開發(fā)環(huán)境的,是 IAR Systems 公司為ARM 微處理器開發(fā)的一個集成開發(fā)環(huán)境。

(3) GNUC 是對應 GNU Compiler Collection 開發(fā)平臺的。 GCC最初是為GNU操作系統(tǒng)專門編寫的一款編譯器,是一款開源的軟件。

(4)TASKING 是對應 Altinum Designer 開發(fā)平臺的。 Altium Designer 是原Protel軟件開發(fā)商Altium公司推出的一體化的電子產(chǎn)品開發(fā)系統(tǒng)。

2、#pragma anon_unions 支持匿名結構體/聯(lián)合體

匿名結構體/聯(lián)合體指的是沒有命名的結構,因為沒有對應的名字,所以也不會直接創(chuàng)建這個對象或者變量,一般都是在嵌套結構中使用。

之所以要使用這個東西進行,是因為在gcc編譯器中是支持匿名結構體/聯(lián)合體的使用的,而在ARMCC中不支持,所以如果要在ARMCC中使用匿名的結構體/結合體,就需要使用 #pragma anon_unions 告知編譯器,不然會編譯不通過。

那到底什么樣的才算是匿名結構體/聯(lián)合體呢? 我下面舉個例子,大家一看就會明白了。

如下代碼:

typedef union


{


struct {


uint32_t Address;


uint32_t OutputBits;


uint32_t ExtendedAddressBits;


uint32_t ExtendedOutputBit;


uint32_t FrameID;


uint32_t EmptyBits;


};


uint32_t Value;


} StdFrame_t;

從上面可以看出來,定義結構體或者聯(lián)合體時,如果沒有命名的話,那這個結構體/聯(lián)合體就是匿名的。

注:#pragma指令來設定編譯器的狀態(tài)或者是指示編譯器完成一些特定的動作。

3、補充幾個調試非常好的操作

3.1、

LINE 用以指示本行語句在源文件中的位置信息,即這條語句在源文件中的行號。

3.2、文件

FILE 用以指示本行語句所在源文件的文件名,即標示這條語句是在哪個源文件中出現(xiàn)的。

3.3、函數(shù)

func 用于指示某個語句出現(xiàn)在哪個函數(shù)中,即可以輸出該語句所在的函數(shù)的函數(shù)名。

注意:這個關鍵字在windows下時使用vc6.0是不支持的。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • ARM
    ARM
    +關注

    關注

    134

    文章

    9006

    瀏覽量

    366033
  • STM32
    +關注

    關注

    2263

    文章

    10846

    瀏覽量

    353701
  • C語言
    +關注

    關注

    180

    文章

    7581

    瀏覽量

    135554
  • 編譯器
    +關注

    關注

    1

    文章

    1607

    瀏覽量

    48977
  • 宏定義
    +關注

    關注

    0

    文章

    49

    瀏覽量

    8981
收藏 人收藏

    評論

    相關推薦

    C語言定義使用技巧

    寫好C語言,漂亮的定義很重要,使用定義可以防止出錯,提高可移植性,可讀性,方便性等等。下面列
    發(fā)表于 07-29 09:35 ?1083次閱讀

    【RT-Thread學習筆記】一種C語言定義的寫法

    【RT-Thread學習筆記】一種C語言定義的寫法
    的頭像 發(fā)表于 07-30 13:41 ?2234次閱讀
    【RT-Thread學習筆記】一種<b class='flag-5'>C</b><b class='flag-5'>語言</b><b class='flag-5'>宏</b><b class='flag-5'>定義</b>的寫法

    C語言定義小技巧

    今天分享一個C語言定義小技巧,從語法上來看比較簡單,不過一旦真正領悟到其精妙之處不僅可以簡化代碼、還能提高代碼的可擴展性。
    發(fā)表于 09-07 09:36 ?605次閱讀

    C語言定義與枚舉類型知識

    定義的標識符不占內存,只是一個臨時的符號,預編譯后這個符號就不存在了。在簡單的程序使用帶參數(shù)的定義可完成函數(shù)調用的功能,又能減少系統(tǒng)開銷,提高運行效率。正如C
    發(fā)表于 10-11 17:34 ?1495次閱讀

    C語言定義講解

    近日在某一技術群又水群時某一群友將這個稱之為“常量”,事實上在C語言中#define 正確的叫法叫做“定義”屬于預處理指令中的一種,在C
    發(fā)表于 10-01 13:28 ?617次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言</b><b class='flag-5'>宏</b><b class='flag-5'>定義</b>講解

    C語言定義

    我感覺還可以
    發(fā)表于 11-19 20:33

    c 語言定義函數(shù)

    #define A(x) x;x;x;x;x;x;x;x;x;x;我明白這個可以起到控制的作用也就是調用10次;但不太明白其中意思,話說中不用分號 ,這個函數(shù),需求詳細解說
    發(fā)表于 10-09 15:42

    C語言定義技巧

    C語言定義技巧
    發(fā)表于 03-01 21:58

    C語言定義使用do{}while(0)的好處是什么

    C語言定義使用do{}while(0)的好處1. 概述經(jīng)常寫項目代碼,有時需要用到定義,而
    發(fā)表于 02-25 06:28

    C語言定義使用技巧

    寫好C語言,漂亮的定義很重要,使用定義可以防止出錯,提高可移植性,可讀性,方便性 等等。下面
    發(fā)表于 11-13 12:04 ?36次下載

    c語言定義技巧

    深入學習c語言的發(fā)燒友可以看看,當然有興趣的入門者也可以看
    發(fā)表于 05-13 11:28 ?0次下載

    c語言定義的使用方法

    作為常量使用時,C程序員習慣在名字中只使用大寫字母。但是并沒有如何將用于其他目的的宏大寫的統(tǒng)一做法。由于(特別是帶參數(shù)的)可能是程序中錯誤的來源,所以一些程序員更喜歡使用大寫字
    發(fā)表于 07-02 15:04 ?1332次閱讀

    C語言基礎:定義使用do{}while(0)的好處

    C語言定義使用do{}while(0)的好處1. 概述 經(jīng)常寫項目代碼,有時需要用到定義,而
    發(fā)表于 01-13 13:06 ?2次下載
    <b class='flag-5'>C</b><b class='flag-5'>語言</b>基礎:<b class='flag-5'>宏</b><b class='flag-5'>定義</b>使用do{}while(0)的好處

    c語言定義用法規(guī)則

    定義會在編譯的時候進行替換展開。最好將中的參數(shù)用括號括起來。這樣就避免了當一個表達式同時含有定義和其他高優(yōu)先級運算符時,破壞整個表達式
    發(fā)表于 07-31 09:39 ?784次閱讀

    c語言定義可以嵌套嗎?

    c語言定義可以嵌套嗎? C語言
    的頭像 發(fā)表于 09-04 17:38 ?3021次閱讀