c++基础——宏定义
宏定义
宏定义的格式如下#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++基础——宏定义相关推荐
- BSP学习Day11 C语言基础 宏定义和宏函数 函数调用 类型转换 数组
目录 1.宏函数和宏定义 2.条件编译 3.类型转换 4.数组 1.宏函数和宏定义 (1)宏定义 宏函数的本质是对源文件进行替换 先声明一个宏,然后再main函数中使用该宏 #define MAX 1 ...
- 错误处理 宏 c语言,C语言零基础教程之预处理和宏定义篇
https://m.toutiao.com/is/JTpvb14/ 前言 上一章节主要讲解C语言文件操作,本章节主要讲解C语言预处理和宏定义. C语言预处理 在C语言中,预处理指令是在实际源代码编译之 ...
- C语言基础:C语言宏定义(4) - 多文件编译
上一节课, 我们讲解了条件编译的一些知识, 这次我们来讲解一下怎么运用宏定义来进行多文件编译. 现在来让我们看一个例子: 输出的结果: PS: 1.运用多个文件编译的时候, 一定要把所有的.c文件一起 ...
- .net 宏定义_C语言基础知识:几种特殊的函数宏封装方式
函数宏介绍 函数宏,即包含多条语句的宏定义,其通常为某一被频繁调用的功能的语句封装,且不想通过函数方式封装来降低额外的弹栈压栈开销. 函数宏本质上为宏,可以直接进行定义,例如: #define INT ...
- 【Kernel学习】基础篇——01一些标准宏定义和文件include关系
先从最简单的宏定义学习学习:熟悉一下内核中的一些基本类型的定义,和代码风格 今天我们从stddef.h文件开始看: 1.include/linux/stddef.h 1 #ifndef _LINUX_ ...
- c语言语法基础之——局部变量及存储类别、全局变量及存储类别、宏定义 学习
宏定义 // 宏定义只是替身,不需要小括号,一般命名用大写字母 #define B(c) c*c main(){int m=5, n=8,k; k=10*B(m+n); // 是 10*5+8*5+8 ...
- C语言基础知识之define宏定义表达式,undef,内存对齐,a和a的区别,数组知识点,int (*)[10] p,二维数组参数与二维指针参数,函数指针数组,常见的内存错误及对策
一.用define宏定义表达式 1.定义一年有多少秒: #define SEC_A_YEAR 60*60*24*365 //上述描述不可靠,没有考虑到在16位系统下把这样一个数赋给整型变量的时候可能会 ...
- C语言宏定义使用技巧
写好C语言,漂亮的宏定义很重要,使用宏定义可以防止出错,提高可移植性,可读性,方便性等等.下面列举一些成熟软件中常用得宏定义...... 1,防止一个头文件被重复包含 #ifndef COMDEF_H ...
- c++宏定义常量为什么使用移位_干货 | C语言系列3——常量,运算符,常用数学函数.........
本期总结 1.符号常量和const常量: 2.运算符: 3.输入与输出: 4.常用数学函数. 往期回顾 干货 | C语言系列1--编程软件与做题平台 干货 | C语言系列2--程序结构与变量 符号常量 ...
最新文章
- DataTable 数据去重复
- zookeeper代码浅析
- 设计模式复习-状态模式
- Maven实战:pom.xml与settings.xml
- Android开发之常见面试题Activity跳转生命周期变化
- 机器人暮色枪骑皮肤_吃鸡幸运新转盘:新载具皮肤和纸盒武器皮肤!
- 简约至上,美炸天的Vue圆环菜单组件
- cgi web页面传入命令
- PAT甲级1017 (模拟排序)
- 潍坊首个小学“教育创客空间”落户呼家庄小学 萝卜(创客)教育走进小学课堂...
- WPF解析Fnt字体
- ios 基础知识点总结
- Java拦截器和过滤器的区别
- Error:(3, 50) java: 程序包com.n.c.caa.cds.commons.constants不存在
- 平面解析几何----圆锥曲线1/AF+1/BF=2/ep的三种证法
- PLC程序的调试方法及步骤
- 分析nmn抗衰老的真实性,nmn的效果到底怎么样
- java的课程总结报告_java课程总结报告
- [转]MySQL数据库引擎
- squid+icap测试配置
热门文章
- 美服fgo显示服务器异常,《fgo》美服错误代码合集及解决办法
- 在windows10使用webp格式图片
- 仙魔契约显示当前服务器爆满,《仙魔契约》符文系统介绍
- C++设计模式:装饰器模式
- DPDK网卡驱动流程总结
- 户外运动如何安全享受音乐、专业户外运动耳机推荐
- C# 数组增加元素_【自学C#】|| 笔记 21 集合续,队列和堆栈
- 叮咚音响登录显示未连接服务器,智能音箱连网失败怎么办?叮咚音箱连网失败解决方法...
- 设计模式(二) ——工厂模式 (3种工厂模式的实现及优缺点)
- 安卓手机USB共享网络步骤