博客
关于我
C/C++的宏
阅读量:628 次
发布时间:2019-03-14

本文共 1287 字,大约阅读时间需要 4 分钟。

一、宏的概念

在C语言中,宏是一种代码替换的预处理阶段的工具,它可以将一段代码或字符串替换为另一个代码或字符串。C语言的宏可以分为无参数和有参数两种形式。无参数的宏简单地将一个字符串或代码替换过去,而有参数的宏则可以接收不同数量的参数,并进行相应的操作。

二、宏的优缺点

优点:

  • 提高程序的可读性和编程效率。宏可以让程序更加简洁且易于理解,同时避免了频繁函数调用的性能开销。
  • 降低函数调用的开销。如果某一部分代码经常被调用,使用宏可以将其升级为直接操作,从而提高程序的运行速度。
  • 缺点:

  • 易引发错误。宏替换在编译阶段进行,有时候替换之后代码的行为与预期不符,可能导致逻辑错误。
  • 缺乏类型检查。宏替换不会进行类型校验,可能导致编译或运行时错误。
  • C++的替代方案。随着C++的发展,const和inline等工具逐渐取代了宏,后者可以提供更强的类型安全性和调试能力。
  • 三、宏的使用

    3.1 宏替换

    宏是C语言中的一个强大工具,常用于代码的简化和常量的定义。例如:

    #define PI 3.141592#define TRUE 1#define FALSE 2

    这些宏可以让代码更加简洁易懂。

    3.2 宏的条件编译

    条件编译是宏的另一个重要用途,常用于以下场景:

  • 避免头文件重复包含。通过使用宏来检查头文件是否已包含。
    #ifndef _TEST_H_#define _TEST_H_... // 内容#endif
  • 选择不同的API。根据编译环境选择合适的API版本。
    #ifndef _UNICODE#define LoadLibrary LoadLibraryA#else#define LoadLibrary LoadLibraryW#endif
  • 注释处理。对于无法嵌套的注释,使用宏可以扩展注释功能。
    #define SHOW_INFO/*#[选项]的意义#*/ // 当SHOW_INFO为0时,将注释去掉
  • 3.3 带参数的宏

    有参数的宏可以实现更复杂的功能,例如求最大值:

    #define MAX(a, b) ((a) > (b) ? (a) : (b))

    通过宏的参数替换,代码变得更加灵活。

    3.4 宏中的 ###

  • # 用于将代码转化为字符串:
    #define STR(a) #a // STR(abc) 展开为 "abc"
  • ## 用于代码的连接:
    #define CONT(a, b) a##b // CONT(cjf, iceking) 展开为 "cjficeking"
  • 四、宏的分析

    在调试宏时,遇到复杂宏嵌套的情况下,可以通过自定义打印工具来分析宏的最终展开形式。例如:

    #define MAX(a, b) ((a) > (b) ? (a) : (b))#define Print1(a) printf("%s", #a)#define Print(a) Print1(a)Print(MAX(2, 3));

    如果不使用Print(a),只使用Print1(a),结果只是打印宏名而不是展开后的代码。通过Print(a)可以看到完整的宏展开过程。

    转载地址:http://dygoz.baihongyu.com/

    你可能感兴趣的文章
    IE浏览器中input的placeholder不显示
    查看>>
    【JavaScript高级篇】ES6
    查看>>
    IDEA配置@Autowired不提示错误
    查看>>
    【CSP - S T1】格雷码
    查看>>
    Python imageio方法示例
    查看>>
    Possible missing firmware
    查看>>
    算法的学习方式
    查看>>
    JAVA BigInteger和BigDecimal类常用方式
    查看>>
    ubuntu挂载移动硬盘出现错误:mount:unknown filesystem type ‘exfat‘
    查看>>
    深度学习框架 各种模型下载集合 -- models list
    查看>>
    双层卷积神经网络--tf
    查看>>
    six.move 的作用
    查看>>
    错误:'BasicLSTMCell' object has no attribute '_kernel'
    查看>>
    常用快捷键等
    查看>>
    MySQL(九)SQL优化
    查看>>
    Django认证系统
    查看>>
    Flask视图进阶
    查看>>
    linux select函数 写一个服务器,转发数据
    查看>>
    QT for MCU (一)开始
    查看>>
    机器学习全教程
    查看>>