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

    文章

    96

    浏览量

    24239
  • 代码
    +关注

    关注

    30

    文章

    4762

    浏览量

    68408
  • 编译器
    +关注

    关注

    1

    文章

    1618

    浏览量

    49075

原文标题:#define的妙用

文章出处:【微信号:c-stm32,微信公众号:STM32嵌入式开发】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    C语言typedef与#define用法和区别

    在C语言编程中,typedef 和 #define是最常用语句,可能很多工作过几年的工程师都没有去深究过它们的一些用法和区别。
    发表于 10-12 10:39 669次阅读

    C语言#define和typedef的区别

    在C语言编程中,typedef 和 #define是最常用语句,可能很多工作过几年的工程师都没有去深究过它们的一些用法和区别。
    发表于 11-03 10:29 672次阅读

    #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 4299次阅读
    XMEGA PWM模块多通道的<b class='flag-5'>用法</b><b class='flag-5'>详解</b>

    C语言中#define的一些用法介绍概述

    今天整理了一些#define用法,与大家共享!1.简单的define定义#define MAXTIME 1
    的头像 发表于 04-14 11:29 7359次阅读

    你会使用Linux 中的“!”惊叹用法

    前言 实际上,不起眼的“!”在linux中有着很多让你惊叹的妙用。本文就来细数那些“!”的神奇用法
    的头像 发表于 01-29 09:08 2570次阅读

    #define的高级用法简介

    #define的高级用法
    的头像 发表于 02-05 11:50 3896次阅读

    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 378次阅读