c语言 宏的一些深层应用(##,#,宏函数)
"##" 宏拼接
#define CONCATENATE(a, b) a ## b
CONCATENATE(student_, 1) // 将a和b拼接起来变成一个新的变量 -> student_1
#define CONS(a,b) int(a##e##b)
CONS(2,3) //将aeb拼接起来 -> 2e3 == 2000
"#" 转换为字符串
#define CONCATENATE(a, b) a ## b
#define STR(s) #s
STR(CONCATENATE(student_, 1))// 将a和b拼接起来变成一个新的变量 -> student_1 再转换为字符串 -> "student_1"
哈哈,你觉得上面注释说的是对的吗?nonono,我在编译器尝试用printf("%s", STR(CONCATENATE(student_, 1)));
输出了一下,输出是CONCATENATE(student_, 1)
。这个优先级问题本文就先不讨论啦,有兴趣的朋友可以自己去看看优先级的问题。
那如果我就是要输出student_1
怎么办呢?起始很简单看我下面操作!
#define CONCATENATE(a, b) a ## b
#define _STR(s) #s
#define STR(s) _STR(s)
这时候编译器的输出就是我们期望的student_1
了。至于原理,咱也不敢问,但是知道有这个用法就行了。
宏函数
// #define 宏名称( [形参列表] ) 替换文本
#define DOUBLE(x) (x+x)
#define MAX(a,b) ((a)>(b)?(a):(b))
更多内容请参考以下文章:
https://blog.csdn.net/m0_62918577/article/details/127361768
https://www.cnblogs.com/hnrainll/archive/2012/08/15/2640558.html
https://blog.csdn.net/weixin_46187354/article/details/133611969
c语言 宏的一些深层应用(##,#,宏函数)的更多相关文章
- 嵌入式C语言自我修养 12:有一种宏,叫可变参数宏
12.1 什么是可变参数宏 在上面的教程中,我们学会了变参函数的定义和使用,基本套路就是使用 va_list.va_start.va_end 等宏,去解析那些可变参数列表我们找到这些参数的存储地址后, ...
- 宏定义(无参宏定义和带参宏定义),C语言宏定义详解
1.宏定义说明 宏定义是比较常用的预处理指令,即使用"标识符"来表示"替换列表"中的内容.标识符称为宏名,在预处理过程中,预处理器会把源程序中所有宏名,替换成宏 ...
- 在C语言中以编程的方式获取函数名
仅仅为了获取函数名,就在函数体中嵌入硬编码的字符串,这种方法单调乏味还易导致错误,不如看一下怎样使用新的C99特性,在程序运行时获取函数名吧. 对象反射库.调试工具及代码分析器,经常会需要在运行时访问 ...
- 嵌入式C语言自我修养 10:内联函数探究
10.1 属性声明:noinline & always_inline 这一节,接着讲 __atttribute__ 属性声明,__atttribute__ 可以说是 GNU C 最大的特色.我 ...
- [转]C语言文件输入/输出ACM改进版(freopen函数)
C语言文件输入/输出ACM改进版(freopen函数) 2009年5月27日 10:379,457 浏览数发表评论阅读评论 文章作者:姜南(Slyar) 文章来源:Slyar Home (www. ...
- 智能合约语言 Solidity 教程系列10 - 完全理解函数修改器
这是Solidity教程系列文章第10篇,带大家完全理解Solidity的函数修改器. Solidity系列完整的文章列表请查看分类-Solidity. 写在前面 Solidity 是以太坊智能合约编 ...
- PHP 语言结构(Language constructs)和函数的区别
相信大家经常看到对比一些PHP应用中,说用isset() 替换 strlen(),isset比strlen执行速度快等. 例子: if ( isset($username[5]) ) { // The ...
- 一道C语言面试题:写一个宏,将16位的整数转为Big Endian
题目:输入16位整数x,如0x1234,将其转为Big Endian格式再输出,此例为输出 0x3412 来源:某500强企业面试题目 思路:将x左移8位得到a,将x右移8位得到b,a+b即为所得 / ...
- C语言,调试必备的DEBUG宏定义
1. #include <stdio.h> #include <stdarg.h> //仅仅是打印函数名字替换 DEBUG <--> printf #define ...
- C语言利用va_list、va_start、va_end、va_arg宏定义可变參数的函数
在定义可变參数的函数之前,先来理解一下函数參数的传递原理: 1.函数參数是以栈这样的数据结构来存取的,在函数參数列表中,从右至左依次入栈. 2.參数的内存存放格式:參数的内存地址存放在内存的堆栈段中, ...
随机推荐
- suffix-icon属性隐藏el-select下拉框右边的下拉图标
<el-form-item label="入库类型" prop="mt_type"> <el-select v-model="for ...
- Stopwatch 类来测量时间间隔
使用 Stopwatch 类来测量时间间隔. 以下是一个示例代码,展示如何记录 Excel 导入的用时: ' 创建 Stopwatch 实例 Dim stopwatch As New Stopwatc ...
- ASP.NET Core 程序集注入(一)
1.创建[特性]用于标注依赖注入 using Microsoft.Extensions.DependencyInjection; using System; using System.Collecti ...
- Pycharm+pytest+allure打造高逼格的测试报告
环境前置提示:allure是基于Java的一个程序,需要Java1.8的环境,没有安装需要去安装一下. 如果在cmd中能输入java,获取到命令信息则不管,否则需要配置系统变量: 路径:计算机> ...
- nacos启动失败:No DataSource set
通过docker查看nacos的日志发现nacos好端端的突然不能用了 docker logs nacos 报错后说是no datasource set,我看了我在docker里的MySQL是正常启动 ...
- 【Vue】HutoolExcel导出
最近写Excel导出功能,发现需求有点复杂,这里整理一下思路和解决方案 一.需求背景: 老系统改造,功能和代码是现成的,预览了一下内容: 第一个是有特定样式,比如首行标题,以及红色的列名称 第二个,导 ...
- 【Eclipse】下载安装(Windows)
Eclipse的下载和安装 官网地址:https://www.eclipse.org/downloads/ 刚用的时候选了安装版,然后安装到一半就失败了 建议点下面的解压包下载,解压即用 注意看框线的 ...
- 实验室深度学习服务器崩溃——Oops: 0000 [#1] SMP NOPTI
这两天实验室的服务器总是崩溃,重启已经不能解决问题了,由于是跑深度学习的服务器,而且还是承接国家级项目的运行服务器,可以说是实验室的主要生产力了,给出报错的日志: Oct 16 09:42:33 ro ...
- SonarQube集成Xunit单元测试
安装SonarQube 利用docker 安装SonarQube docker run -d --name sonarqube -e SONAR_ES_BOOTSTRAP_CHECKS_DISABLE ...
- Apache DolphinScheduler:深入了解大数据调度工具
一.海豚调度介绍 Apache DolphinScheduler 是一个分布式易扩展的可视化DAG工作流任务调度开源系统.适用于企业级场景,提供了一个可视化操作任务.工作流和全生命周期数据处理过程的解 ...