博客
关于我
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/

    你可能感兴趣的文章
    去了解拉绳位移编码器的影响因素
    查看>>
    无法初始化Winsock2.2处理
    查看>>
    vMotion 操作失败进度卡在14% ,报错: Operation Timed out
    查看>>
    重置UAG Application admin密码
    查看>>
    Horizon Daas租户管理平台扩展分配时报:内部错误
    查看>>
    项目计划甘特图绘制说明
    查看>>
    嵌入式系统试题库(CSU)
    查看>>
    图神经网络7日打卡营学习心得
    查看>>
    Method breakpoints may dramatically slow down debugging
    查看>>
    【自考】之信息资源管理(一)
    查看>>
    setup facatory9.0打包详细教程(含静默安装和卸载)
    查看>>
    ionic4 路由跳转传值
    查看>>
    pwn题shellcode收集
    查看>>
    python中的序列化
    查看>>
    HTTP/2 协议详解
    查看>>
    2018年3月最新的Ubuntu 16.04.4漏洞提权代码
    查看>>
    spark概述
    查看>>
    JavaScript 知识梳理[一] 变量类型,浅拷贝,深拷贝
    查看>>
    java.security.InvalidKeyException: Illegal key size
    查看>>
    Linux kernel pwn --- CSAW2015 StringIPC
    查看>>