精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

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

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

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

C語(yǔ)言宏定義的使用原理

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

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

#if defined (__CC_ARM)


#pragma anon_unions


#endif

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

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

1) __CC_ARM

2) #pragma anon_unions

這兩個(gè)都有啥用呢? 待我一一道來(lái)!

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

__CC_ARM 是一個(gè)編譯器的選項(xiàng),在ARM開發(fā)中根據(jù)開發(fā)環(huán)境的不同,有好幾個(gè)可選的宏選項(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 是對(duì)應(yīng) ARM RealView 開發(fā)平臺(tái)的,它需結(jié)合uvision、eclipse或CodeWarrior等開發(fā)環(huán)境來(lái)使用的。

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

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

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

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

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

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

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

如下代碼:

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;

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

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

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

3.1、

LINE 用以指示本行語(yǔ)句在源文件中的位置信息,即這條語(yǔ)句在源文件中的行號(hào)。

3.2、文件

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

3.3、函數(shù)

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

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

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

    關(guān)注

    134

    文章

    9046

    瀏覽量

    366821
  • STM32
    +關(guān)注

    關(guān)注

    2266

    文章

    10871

    瀏覽量

    354821
  • C語(yǔ)言
    +關(guān)注

    關(guān)注

    180

    文章

    7598

    瀏覽量

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

    關(guān)注

    1

    文章

    1618

    瀏覽量

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

    關(guān)注

    0

    文章

    50

    瀏覽量

    9001
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    C語(yǔ)言定義使用技巧

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

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

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

    C語(yǔ)言定義小技巧

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

    C語(yǔ)言定義與枚舉類型知識(shí)

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

    C語(yǔ)言定義

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

    c 語(yǔ)言定義函數(shù)

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

    C語(yǔ)言定義技巧

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

    C語(yǔ)言定義中#和##的作用

    本文由dongeasy收集整理,原文鏈接:http://www.dongeasy.com/software-development/embedded-system/2013.html在定義
    發(fā)表于 08-23 18:22

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

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

    C語(yǔ)言定義使用技巧

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

    c語(yǔ)言定義技巧

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

    c語(yǔ)言定義的使用方法

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

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

    C語(yǔ)言定義使用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'>語(yǔ)言</b>基礎(chǔ):<b class='flag-5'>宏</b><b class='flag-5'>定義</b>使用do{}while(0)的好處

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

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

    c語(yǔ)言定義可以嵌套嗎?

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