宏定义

宏定义的格式如下#define 标识符 替换内容主要有三种类型

  • 定义常量符号:#define PI 3.1415926

  • 定义简单表达式:#define add(a,b) a+b

  • 定义代码段

    #define func(a) { \printf("hello %s", a); \
    }
    

    由于宏在预处理阶段仅仅是做简单的替换,因此有时候会出现一些问题,例如如下代码define.cc

    #include <cstdio>
    #define add(a,b) a+bint main(){printf("add(3,4)*5 = %d\n",add(3,4)*5);return 0;
    }
    

    由于add(3,4)仅仅是做简单替换,因此实际上被编译的源码是 printf("add(3,4)*5 = %d\n",3+4*5),可以通过 g++ -E define.cc -o tmp.cc 查看main函数里面实际被编译的代码:

    # 4 "define.cc"
    int main(){printf("add(3,4)*5 = %d\n",3 +4*5);return 0;
    }
    

    编译器的内置宏定义

    说明
    __DATE__ 日期:Mmm dd yyyy
    __TIME__ 时间:hh:mm:ss
    __LINE__ 行号
    __FILE__ 文件名
    __func__ 函数名/不是所有编译器都支持
    __FUNC__ 函数名/不是所有编译器都支持
    __PRETTY_FUNCTION__ 更详细的函数信息/不是所有编译器都支持

    简单引用示例,定义一个log函数,显示文件名、函数名以及对用的行数,并将以上信息用绿色字体表示

    #include<cstdio>
    #define LOG(frm,args...) {\
    printf("\033[0;32m[%s:%s:%d]\033[0m",__FILE__,__func__,__LINE__);\
    printf(frm,##args);\
    printf("\n");\
    }
    int main(){LOG("add(3,4)*5 %s %d\n","=",add(3,4)*5);LOG("hello,world"); // `##args`用来支持可变参数为空的情况return 0;
    }
    

    以上LOG 宏定义中args...是可变参数,##args用来支持可变参数为空的情况

c++基础——宏定义相关推荐

  1. BSP学习Day11 C语言基础 宏定义和宏函数 函数调用 类型转换 数组

    目录 1.宏函数和宏定义 2.条件编译 3.类型转换 4.数组 1.宏函数和宏定义 (1)宏定义 宏函数的本质是对源文件进行替换 先声明一个宏,然后再main函数中使用该宏 #define MAX 1 ...

  2. 错误处理 宏 c语言,C语言零基础教程之预处理和宏定义篇

    https://m.toutiao.com/is/JTpvb14/ 前言 上一章节主要讲解C语言文件操作,本章节主要讲解C语言预处理和宏定义. C语言预处理 在C语言中,预处理指令是在实际源代码编译之 ...

  3. C语言基础:C语言宏定义(4) - 多文件编译

    上一节课, 我们讲解了条件编译的一些知识, 这次我们来讲解一下怎么运用宏定义来进行多文件编译. 现在来让我们看一个例子: 输出的结果: PS: 1.运用多个文件编译的时候, 一定要把所有的.c文件一起 ...

  4. .net 宏定义_C语言基础知识:几种特殊的函数宏封装方式

    函数宏介绍 函数宏,即包含多条语句的宏定义,其通常为某一被频繁调用的功能的语句封装,且不想通过函数方式封装来降低额外的弹栈压栈开销. 函数宏本质上为宏,可以直接进行定义,例如: #define INT ...

  5. 【Kernel学习】基础篇——01一些标准宏定义和文件include关系

    先从最简单的宏定义学习学习:熟悉一下内核中的一些基本类型的定义,和代码风格 今天我们从stddef.h文件开始看: 1.include/linux/stddef.h 1 #ifndef _LINUX_ ...

  6. c语言语法基础之——局部变量及存储类别、全局变量及存储类别、宏定义 学习

    宏定义 // 宏定义只是替身,不需要小括号,一般命名用大写字母 #define B(c) c*c main(){int m=5, n=8,k; k=10*B(m+n); // 是 10*5+8*5+8 ...

  7. C语言基础知识之define宏定义表达式,undef,内存对齐,a和a的区别,数组知识点,int (*)[10] p,二维数组参数与二维指针参数,函数指针数组,常见的内存错误及对策

    一.用define宏定义表达式 1.定义一年有多少秒: #define SEC_A_YEAR 60*60*24*365 //上述描述不可靠,没有考虑到在16位系统下把这样一个数赋给整型变量的时候可能会 ...

  8. C语言宏定义使用技巧

    写好C语言,漂亮的宏定义很重要,使用宏定义可以防止出错,提高可移植性,可读性,方便性等等.下面列举一些成熟软件中常用得宏定义...... 1,防止一个头文件被重复包含 #ifndef COMDEF_H ...

  9. c++宏定义常量为什么使用移位_干货 | C语言系列3——常量,运算符,常用数学函数.........

    本期总结 1.符号常量和const常量: 2.运算符: 3.输入与输出: 4.常用数学函数. 往期回顾 干货 | C语言系列1--编程软件与做题平台 干货 | C语言系列2--程序结构与变量 符号常量 ...

最新文章

  1. DataTable 数据去重复
  2. zookeeper代码浅析
  3. 设计模式复习-状态模式
  4. Maven实战:pom.xml与settings.xml
  5. Android开发之常见面试题Activity跳转生命周期变化
  6. 机器人暮色枪骑皮肤_吃鸡幸运新转盘:新载具皮肤和纸盒武器皮肤!
  7. 简约至上,美炸天的Vue圆环菜单组件
  8. cgi web页面传入命令
  9. PAT甲级1017 (模拟排序)
  10. 潍坊首个小学“教育创客空间”落户呼家庄小学 萝卜(创客)教育走进小学课堂...
  11. WPF解析Fnt字体
  12. ios 基础知识点总结
  13. Java拦截器和过滤器的区别
  14. Error:(3, 50) java: 程序包com.n.c.caa.cds.commons.constants不存在
  15. 平面解析几何----圆锥曲线1/AF+1/BF=2/ep的三种证法
  16. PLC程序的调试方法及步骤
  17. 分析nmn抗衰老的真实性,nmn的效果到底怎么样
  18. java的课程总结报告_java课程总结报告
  19. [转]MySQL数据库引擎
  20. squid+icap测试配置

热门文章

  1. 美服fgo显示服务器异常,《fgo》美服错误代码合集及解决办法
  2. 在windows10使用webp格式图片
  3. 仙魔契约显示当前服务器爆满,《仙魔契约》符文系统介绍
  4. C++设计模式:装饰器模式
  5. DPDK网卡驱动流程总结
  6. 户外运动如何安全享受音乐、专业户外运动耳机推荐
  7. C# 数组增加元素_【自学C#】|| 笔记 21 集合续,队列和堆栈
  8. 叮咚音响登录显示未连接服务器,智能音箱连网失败怎么办?叮咚音箱连网失败解决方法...
  9. 设计模式(二) ——工厂模式 (3种工厂模式的实现及优缺点)
  10. 安卓手机USB共享网络步骤