吴忠躺衫网络科技有限公司

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

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

3天內不再提示

詳解#define的奇妙用法

STM32嵌入式開發 ? 來源:CSDN技術社區 ? 作者:CSDN技術社區 ? 2022-03-22 09:03 ? 次閱讀

在 C/C++ 編程語言中,當程序被編譯時,被發送到編譯器,編譯器將程序轉換為機器語言,然后完成編譯并執行該程序。處理器也稱為宏預處理器。C /C++中的宏可以定義為一組程序語句,并在必須使用這些代碼集時使用該名稱。

這些宏始終以符號“#”開頭,以該符號開頭的語句由編譯器調用。

#define 奇妙用法

  • 特殊符號:#,##,#@

該宏還可用于傳遞可以通過在標記前使用“#”特殊符號將其轉換為字符串的標記。讓我們看一個例子:

#include #define GET_STRING(n) #n
int main(int argc, char *argv[]){ printf("%s
", GET_STRING(minger)); return 0;}

4482bacc-a91f-11ec-952b-dac502259ad0.png

在上面的代碼中,我們定義了類似函數的宏,其中參數“n”與“#n”一起傳遞,這將允許您檢索字符串文字。

該宏還支持將可以傳遞給宏以使用特殊運算符“##”連接字符串。讓我們看一個例子:

#include #define CONCATE(p, q) p##qint main(int argc, char *argv[]){ printf("%d 
", CONCATE(12, 13)); return 0;}

449dcd62-a91f-11ec-952b-dac502259ad0.png

上面的代碼定義了類似函數的宏,其中傳遞令牌以連接“p”和“q”兩個值。

下面我們接著看看#@使用。

#include #define TO_STRING(s) #s
int main(int argc, char *argv[]){ printf("%s
", TO_STRING(812)); return 0;}

44b3a254-a91f-11ec-952b-dac502259ad0.png

在上面的代碼中,我們定義了類似函數的宏,#s 表示用雙引號包括參數s,返回一個字符串。

  • 多行宏

類似對象的宏可以有多行。因此,要創建多行宏,您必須使用反斜杠換行符。

#include  #define ELE 1,             2,             3int main(int argc, char *argv[]){ int i = 0;    int arr[] = { ELE };    printf("Elements of Array are:
");     for (i = 0; i < 3; i++)  {        printf("%d  ", arr[i]);    } printf("
");     return 0;}

44c3cf3a-a91f-11ec-952b-dac502259ad0.png

宏也可以寫成多行,語句以“”開頭,不需要以“”結尾。讓我們再看一個例子:

#include  #define MACRO(n, limit) while (n < limit) { printf("minger "); n++; }int main(int argc, char *argv[]){ int n = 0; MACRO(n, 5); printf("
"); return 0;}

44d7abd6-a91f-11ec-952b-dac502259ad0.png

  • 可變參數宏

可變參數宏是具有可變數量參數的宏(也可以用 C 編寫可變參數函數)。下面是一個例子:

#include #define debugPrintf(...) printf("DEBUG: " __VA_ARGS__);int main(int argc, char** argv){ debugPrintf("Hello World!
"); return 0;}

44ee94e0-a91f-11ec-952b-dac502259ad0.png

簡單來說,...表示所有剩下的參數,__VA_ARGS__被宏定義中的...參數所替換。這在c語言的GNU擴展語法里是一個特殊規則:當__VA_ARGS__為空時,會消除前面這個逗號。

  • 條件編譯
#include#define debugPrintf /*定義一個宏開關,屏蔽則關閉,不屏蔽則打開 */#ifdef debugPrintf#define debugPrintf(...) printf("DEBUG: " __VA_ARGS__);#else#define debugPrintf(...)#endifint main(int argc, char** argv){ debugPrintf(" This is  Debug info
"); printf(" This is  printf  info
"); return 0;}

4507dcc0-a91f-11ec-952b-dac502259ad0.png

如果我們要輸出DEBUG版本,則打開這個宏開關(不屏蔽#define debugPrintf ),此時所有的debugPrintf ()宏定義信息都會被替換成為printf()。

總結

宏是程序中由宏的值替換的一段代碼。宏由#define 指令定義。每當編譯器遇到宏名稱時,它就會用宏的定義替換名稱。宏定義不需要以分號;結束。

原文標題:#define的妙用

文章出處:【微信公眾號:STM32嵌入式開發】歡迎添加關注!文章轉載請注明出處。
審核編輯:湯梓紅


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

    關注

    1

    文章

    97

    瀏覽量

    24290
  • 代碼
    +關注

    關注

    30

    文章

    4825

    瀏覽量

    69043
  • 編譯器
    +關注

    關注

    1

    文章

    1642

    瀏覽量

    49283

原文標題:#define的妙用

文章出處:【微信號:c-stm32,微信公眾號:STM32嵌入式開發】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    C語言typedef與#define用法和區別

    在C語言編程中,typedef 和 #define是最常用語句,可能很多工作過幾年的工程師都沒有去深究過它們的一些用法和區別。
    發表于 10-12 10:39 ?708次閱讀

    C語言#define和typedef的區別

    在C語言編程中,typedef 和 #define是最常用語句,可能很多工作過幾年的工程師都沒有去深究過它們的一些用法和區別。
    發表于 11-03 10:29 ?696次閱讀

    #ifdef,#else,#endif,#if用法詳解(轉載)

    [size=11.818181991577148px]轉載------#ifdef,#else,#endif,#if用法詳解[size=11.818181991577148px]hxing( 樓主
    發表于 12-06 00:10

    typedef與define用法與區別

    typedef與define在一些用法上有一些相似之處,所以對于這方面接觸不多的朋友可能會有所混淆,下面分享一個圖,很清晰地對兩者的用法作了區分。
    發表于 08-10 13:50

    OrCAD中創建總線及用法詳解

    OrCAD中創建總線及用法詳解,如何創建總線,菜單place->bus或者右側快捷按鈕
    發表于 12-02 10:18 ?2.6w次閱讀

    C語言之詳解_ifdef等宏及妙用

    C語言之詳解_ifdef等宏及妙用的教程
    發表于 11-16 19:03 ?0次下載

    電阻的巧妙用法

    電阻的巧妙用法
    發表于 12-16 12:59 ?0次下載

    XMEGA PWM模塊多通道的用法詳解

    本文主要詳解XMEGA PWM模塊多通道的用法,具體的跟隨小編來了解一下。
    的頭像 發表于 06-18 14:09 ?4394次閱讀
    XMEGA PWM模塊多通道的<b class='flag-5'>用法</b><b class='flag-5'>詳解</b>

    C語言中#define的一些用法介紹概述

    今天整理了一些#define用法,與大家共享!1.簡單的define定義#define MAXTIME 1
    的頭像 發表于 04-14 11:29 ?7435次閱讀

    你會使用Linux 中的“!”驚嘆用法

    前言 實際上,不起眼的“!”在linux中有著很多讓你驚嘆的妙用。本文就來細數那些“!”的神奇用法。
    的頭像 發表于 01-29 09:08 ?2620次閱讀

    #define的高級用法簡介

    #define的高級用法
    的頭像 發表于 02-05 11:50 ?4016次閱讀

    CAN現場總線的妙用

    CAN現場總線的妙用說明。
    發表于 04-20 09:58 ?14次下載

    C語言中的typedef的用法

    在以前的學習中對于C語言中typedef和define的認識是,#define是宏,作用是簡單的替換,而typedef也是替換,只不過比define高級的是在替換的時候會進行語法檢查。但是后來
    發表于 01-13 13:36 ?0次下載
    C語言中的typedef的<b class='flag-5'>用法</b>

    CMake用法詳解

    CMake用法詳解
    發表于 10-25 16:28 ?2次下載

    SV中define宏定義的用法

    SV中使用預處理指令`define來定義宏,宏可以用來創建文本替換。根據場景不同,`define主要用來定義常量、簡化復雜的表達式或代碼段以及提高代碼的可移植性。其基本語法為:
    的頭像 發表于 10-21 14:22 ?785次閱讀
    百家乐官网太阳城小郭| 云鼎百家乐官网作弊| 上海百家乐赌博| 大发888注册账号| 网上赌百家乐官网可信吗| 地理风水24山72局杨公水法| 大发888bet娱乐城| 澳门百家乐官网会出老千吗| 网上百家乐游戏下载| 攀枝花市| 百家乐怎么刷反水| 九州娱乐城| 百家乐官网麻将牌| 棋牌休闲游戏| 永利百家乐官网赌场娱乐网规则| 百家乐官网追号工具| 全讯网网址导航| 百家乐官网出闲几率| 盐城百家乐的玩法技巧和规则| 博发百家乐官网游戏| 百家乐注册平台排名| 伟易博| 百家乐官网专打方法| bet365娱乐场| 网络百家乐娱乐| 新利线上娱乐| 百家乐现场新全讯网| 康乐县| 百家乐平技巧| 澳门百家乐官网21点| 东营区百家乐艺术团| 足球百家乐官网投注计算| 百家乐3式打法微笑心法| 最新百家乐官网电脑游戏机| 太阳城莱迪广场| 百家乐官网赌场娱乐网规则| 大发888客服电话| 2024年九运的房屋风水| 真人斗地主| 百家乐双人操作分析仪| 七胜百家乐官网娱乐城总统网上娱乐城大都会娱乐城赌场 |