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

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

C語言宏定義的使用原理

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

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

#if defined (__CC_ARM)


#pragma anon_unions


#endif

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

上面的代碼段我們可以看到兩部分的內(nèi)容:

1) __CC_ARM

2) #pragma anon_unions

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

1、__CC_ARM 是 ARM 編譯中的宏選項(xiàng)

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

這些選項(xiàng)可以查看所開發(fā)的芯片的內(nèi)核文件,比如我使用的是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 是對應(yīng) ARM RealView 開發(fā)平臺的,它需結(jié)合uvision、eclipse或CodeWarrior等開發(fā)環(huán)境來使用的。

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

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

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

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

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

之所以要使用這個東西進(jìn)行,是因?yàn)樵趃cc編譯器中是支持匿名結(jié)構(gòu)體/聯(lián)合體的使用的,而在ARMCC中不支持,所以如果要在ARMCC中使用匿名的結(jié)構(gòu)體/結(jié)合體,就需要使用 #pragma anon_unions 告知編譯器,不然會編譯不通過。

那到底什么樣的才算是匿名結(jié)構(gòu)體/聯(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;

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

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

3、補(bǔ)充幾個調(diào)試非常好的操作

3.1、

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

3.2、文件

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

3.3、函數(shù)

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

注意:這個關(guān)鍵字在windows下時(shí)使用vc6.0是不支持的。

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

    關(guān)注

    134

    文章

    8967

    瀏覽量

    365049
  • STM32
    +關(guān)注

    關(guān)注

    2258

    文章

    10828

    瀏覽量

    352497
  • C語言
    +關(guān)注

    關(guān)注

    180

    文章

    7575

    瀏覽量

    134102
  • 編譯器
    +關(guān)注

    關(guān)注

    1

    文章

    1602

    瀏覽量

    48896
  • 宏定義
    +關(guān)注

    關(guān)注

    0

    文章

    48

    瀏覽量

    8956
收藏 人收藏

    評論

    相關(guān)推薦

    C語言定義使用技巧

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

    【RT-Thread學(xué)習(xí)筆記】一種C語言定義的寫法

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

    C語言定義小技巧

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

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

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

    C語言定義講解

    近日在某一技術(shù)群又水群時(shí)某一群友將這個稱之為“常量”,事實(shí)上在C語言中#define 正確的叫法叫做“定義”屬于預(yù)處理指令中的一種,在C
    發(fā)表于 10-01 13:28 ?579次閱讀
    <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;我明白這個可以起到控制的作用也就是調(diào)用10次;但不太明白其中意思,話說中不用分號 ,這個函數(shù),需求詳細(xì)解說
    發(fā)表于 10-09 15:42

    C語言定義技巧

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

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

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

    C語言定義使用技巧

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

    c語言定義技巧

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

    c語言定義的使用方法

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

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

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

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

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

    c語言定義可以嵌套嗎?

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