c语言字符串化# 和 宏连接符##

【001 关键字】宏定义中的#和##的用法 一、字符串化操作符 # # 的功能:将其后面的宏参数进行字符串化操作。 注意:只能用于有传入参数的宏定义中,且必须置于宏定义体中的参数名前。 #include<stdio.h> #define Str(s) #s int main() { printf(Str(HelloWorld)); return; } 输出:HelloWorld 二、符号连接操作符 ## ##是连接符,前加##或后加##,将标记作为一个合法的标识符的一部分 #include<stdi 阅读详情

我们使用 # 把宏参数变为一个字符串
用 ## 把两个宏参数贴合在一起。

1、##(宏连接)

#define CONS(a,b)  int(a##e##b)
printf("%d\n", CONS(2,3));  // 2e3 输出:2000

2、#(字符串化)

  • 我们使用 # 把宏参数变为一个字符串
#define STR(s)     #s
printf(STR(vck));           // 输出字符串"vck"
  • 注意:如果 # 的参数是一个宏,那么这个宏不会被替换,而是直接将这个宏转换为字符串型。
    如下
#include<stdio.h>

#define	A	B
#define B	C
#define C	D

#define _str_1(X)	#X
// 一般会设置此中间层,在这一步中,X若是宏的话会被转成宏值,下一步执行_str_1() 才会被转成字符串
#define	_str(X)		_str_1(X)

int main(int argc, char** argv)
{
	puts(_str(A));
	puts(_str_1(A));
	return 0;
}

运行结果

D
A
  • 结论:
    1、不论一个 宏 X 内嵌套了多少层宏,在 _str(X) 转换为 _str_1(X) 这一步中, X 都能一步到位,变为最终
    值,然后在通过 # 字符串化。
    2、如果 # 的参数是一个宏,那么这个宏不会被替换,而是直接将这个宏转换为字符串型。
    3、代码块第8行。
第三篇:AMD 和 Intel 它像“乐高积木”一样,可以通过标准化的接口与其他部分组合,构建复杂系统。理解组件后,你会发现从操作系统到微服务,现代软件本质上都是组件的组合! 阅读详情

相关推荐

Windows 11 下 WSL 离线安装 Ubuntu 22.04 保姆级教程(国内镜像加速版)

本文提供了一份针对中国地区用户的Windows 11下WSL离线安装Ubuntu 22.04的详细教程。通过使用国内镜像源加速下载安装包,并配合PowerShell命令完成部署,有效解决了官方商店下载缓慢的问题。教程涵盖环境准备、离线包获取、安装初始化及安装后的关键优化配置,帮助用户快速搭建高效的Linux开发环境。

weixin_28452161的博客 1378

C宏定义中的连接符“##“和字符串化操作符“# “及变参宏“...“

C语言中如何使用宏C(和C++)中的宏(Macro)属于编译器预处理的范畴,属于编译期概念(而非运行期概念)。 1、宏定义中字符串化操作符#: #的功能是将其后面的宏参数进行字符串化操作,意思就是对它所应用的宏变量通过替换后在其左右各加上一个双引号。 例如: #define WARN_IF(EXPR)\ do {\ if (EXPR)\ fprintf(stderr, "Warning: " #EXPR "\n");\ } while(0) 上面代码中的反斜线\主要用来.

y0608122008的博客 1741

国外无人机蜂群作战典型战例及发展趋势

参与袭击的无人机为简易组装的固定翼飞机,采用小排量活塞发动机和手机GPS通信模块零件,机翼为轻木加泡沫板混合结构,尾梁为铝合金方管,主要依靠胶带粘接,以上全部配件均可在商用市场买到,成本较低,可在短时间内装配完成。③战场纵深短、瞬时性强。蜂群作战的参战数量显著增加,这一方面得益于无人机技术的飞速发展使得廉价无人机可以大量生产和仿制,另一方面凭借迅速发展的投放和回收技术以及集群控制技术,使得无人机蜂群可在极短时间内实现编队饱和攻击,在快速消耗敌方高价值防空武器系统的同时,保证己方物资系统的突防概率。

renhongxia1的博客 2480

c 语言中宏参数的字符串化跟宏参数的连接

c语言中的宏有无参数的宏,也有带参数的宏。 其实宏就相当与一个字符串模板,然后预处理器在有宏的标志处,把宏展开,说明白点,也就是字符串的替换工作。不过这个工作发生在编译之前,以前一直不理解,感觉c语言中的宏有多高大上,原来只是对你的c代码进行一些字符串的替换工作,替换后,还是c语言,然后才开始编译成汇编等指令。 现在说说如何定义一个有参数的宏,比如最简单的宏定义 #define MAX(a,b) ...

aLLLiyyy的博客 1795

ROS2实战:打造智能巡检机器人的关键技术与实现

本文详细介绍了基于ROS2和Navigation2构建智能巡检机器人的完整实战流程。通过设计主从协作的事件驱动架构,实现了机器人在已知地图中的自动导航、定点语音播报和环境图像采集功能。文章涵盖了从环境搭建、仿真配置到核心控制节点、语音服务与图像记录模块的代码实现,为开发者打造实用的自动巡检机器人提供了清晰的技术指南。

weixin_29031057的博客 223

libiec61850实战:手把手教你用C语言动态获取IED设备模型(附完整代码解析)

本文详细介绍了如何使用libiec61850库通过C语言动态获取IED设备模型,包括环境配置、连接建立、模型遍历及错误处理等关键步骤。通过完整的代码示例和实战案例,帮助开发者掌握智能变电站通信中的核心技术,提升工业自动化系统的开发效率。

weixin_42519985的博客 434

C语言编程(1)—— 预处理命令

预处理 什么是预处理  在编译之前对源文件进行简单加工的过程,就称为预处理(即预先处理、提前处理)。以#开头的命令为预处理命令。  预处理是C语言的一个重要功能,由预处理程序完成。当对一个源文件进行编译时,系统将自动调用预处理程序对源程序中的预处理部分作处理,处理完毕自动进入对源程序的编译。编译器会将预处理的结果保存到和源文件同名的.i文件中,例如 main.c 的预处理结果在 main.i 中。和.c一样,.i也是文本文件,可以用编辑器打开直接查看内容。 预处理命令 —— #include 功能  #in

m0_60337039的博客 1938

Android 音频源码分析——音量调节流程

源码分析基于android9.0 一、声音类型 对于大多数手机用户来说,操作手机音量按键可以看到,声音类型分为四种:媒体、铃声、闹钟、通话,但是其系统内部则分为十几种类型。 声⾳类型用来区分不同播放用途及播放设备,包含11中类型 定义在 frameworks/base/media/java/android/media/AudioSystem.java中 /** Used to identify the default audio stream volume */ public static final in

奋斗的菜鸟ing 3818

C语言宏参数的字符串化和宏参数的连接

在宏定义中,有时还会用到 # 和 ## 两个符号,它们能够对宏参数进行操作。 的用法 用来将宏参数转换为字符串,也就是在宏参数的开头和末尾添加引号。例如有如下宏定义: #define STR(s) #s 那么: printf("%s", STR(c.biancheng.net)); printf("%s", STR(“c.biancheng.net”)); 分别被展开为: printf("%s", “c.biancheng.net”); printf("%s", ““c.biancheng.net””);

u012127512的博客 1265

层层剥开Allegro skill--快速抓取并写入Allegro软件【呕血创作,转载注明】

Allegro skill eda pcb

qq_36492361的博客 1253

第7次CCF PTA编程培训师资认证-T1 真题解析(2024下)

B。

lan_in的博客 513

C语言中定义变量“#X”,”X##”, “##X” 和“##X##”解析

关于#和## 在C语言的宏中,#的功能是将其后面的宏参数进行字符串化操作(Stringfication),简单说就是在对它所引用的宏变量通过替换后在其左右各加上一个双引号。比如下面代码中的宏: 1. #使用 #define WARN_IF(EXP) / do{ if (EXP) / fprintf(stderr, "Warning: " #EXP "/n"); } / while(0) 那么实际使用中会出现下面所示的替换过程: WARN_IF (divider );其中div...

dayou1024的博客 4459

如何用matlab扫频法测考虑频率耦合的并网逆变器的序阻抗,如何实现?

🏆本文收录于 《全栈Bug调优(实战版)》 专栏,该专栏专注于分享我在真实项目开发中遇到的各类疑难Bug及其深层成因,并系统提供高效、可复现的解决思路和实操方案。无论你是刚入行的新手开发者,还是拥有多年项目经验的资深工程师,本专栏都将为你提供一条系统化、高质量的问题排查与优化路径,助力你加速成长,攻克技术壁垒,迈向技术价值最大化与职业发展的更高峰🚀!

**My Coding Family** 1193

C语言宏定义##连接符和#符的使用

C语言宏定义##连接符和#符的使用  document.body.oncopy = function() { if (window.clipboardData) { setTimeout(function() { var text = clipboardData.get

运用之妙,存乎一心 12万+

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

[c语言]宏中 #和##的用法

在代码中,看到了包含##的宏。 例如:#define clear_opt(o, opt)       o &= ~EXT2_MOUNT_##opt 于是,一起看了下# 和 ##在宏中的用法。 wiki中的解释如下: # 为 字符串转换符, 将包含的字段转换为字符串。 ## 为 字段连接符,将两个字段 连接为 一个字段。 wiki的示例有一段示例比较有

sqk0315的博客 466

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

C语言宏定义中的#和##

的功能是将其后面的宏参数进行字符串化操作,简单说就是替换后在其左右各加上一个双引号。printfEXP例如,PRINT(aaa)实际使用被替换为##被称为连接符,用来将两个Token连接为一个Token。注意这里连接的对象是Token就行,而不一定 是宏的变量。那么,下面语句。

qq_43248127的博客 466

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

mysql的双井号_C/C++ 宏中的 单/双井号 ( # and ## )

一、一般用法#的功能是将其后面的宏参数进行字符串化操作(Stringfication),简单说就是在对它所引用的宏变量通过替换后在其左右各加上一个双引号。比如下面代码中的宏:#define WARN_IF(EXP)\do{ if (EXP)\fprintf(stderr, "Warning: " #EXP "\n"); }\while(0)那么实际使用中会出现下面所示的替换过...

weixin_42168230的博客 325

C/C++ 宏带

关于#和##在C语言的宏中,#的功能是将其后面的宏参数进行字符串化操作(Stringfication),简单说就是在对它所引用的宏变量通过替换后在其左右各加上一个双引号。比如下面代码中的宏:#define WARN_IF(EXP)     /     do{ if (EXP)     /             fprintf(stderr, "Warning: " #EXP "/n"); }

我的的专栏 484

C语言中定义变量“#X”,"X##", "##X" 和“##X##”用意

关于#和## 在C语言的宏中,#的功能是将其后面的宏参数进行字符串化操作(Stringfication),简单说就是在对它所引用的宏变量通过替换后在其左右各加上一个双引号。比如下面代码中的宏: 1. #使用 #define WARN_IF(EXP) /   do{ if (EXP) /   fprintf(stderr, "Warning: " #EXP "/n"); } /   wh

MEIC51的专栏 2096

c语言字符连接宏,C语言基础之宏定义##连接符和#符

一、#在函数式宏定义中,#运算符用于创建字符串,简单说就是在它引用的宏变量的左右各加上一个双引号。#运算符后面应该跟一个形参(中间可以有空格或Tab),如定义好#define STRING(x) #x之后,下面二条语句就等价。char *pChar = "hello";char *pChar = STRING(hello);还有一个#@是加单引号(Charizing Operator)#defin...

weixin_35677043的博客 2196

c语言#和## 的用法

关于#和## 在C语言的宏中,#的功能是将其后面的宏参数进行字符串化操作(Stringfication),简单说就是在对它所引用的宏变量通过替换后在其左右各加上一个双引号。比如下面代码中的宏: #define WARN_IF(EXP) do{ if (EXP) fprintf(stderr, "Warning: " #EXP "/n"); } while(0) 那么

wangbinyantai的专栏 1392

C语言宏与单井号(#)和双井号(##)

C(和C++)中的宏(Macro)属于编译器预处理的范畴,属于编译期概念(而非运行期概念)。下面对常遇到的宏的使用问题做了简单总结。 关于#和## 在C语言的宏中,#的功能是将其后面的宏参数进行字符串化操作(Stringfication),简单说就是在对它所引用的宏变量通过替换后在其左右各加上一个双引号。比如下面代码中的宏: #define WARN_IF(EXP) /   do{ if

ytlcainiao的专栏 1437

C语言宏的高级应用

关于#和##在C语言的宏中,#的功能是将其后面的宏参数进行字符串化操作(Stringfication),简单说就是在对它所引用的宏变量通过替换后在其左右各加上一个双引号。比如下面代码中的宏: #define WARN_IF(EXP)     /     do{ if (EXP)     / fprintf(stderr, "Warning: " #EXP "/n");

日知录 1784

VC #define EC(x) L##x 作用说明

#define EC(x) L##x 作用说明 表示L与x连接。 #define Conn(x,y) x##y #define ToChar(x) #@x #define ToString(x) #x x##y表示什么?表示x连接y,举例说: int n = Conn(123,456); 结果就是n=123456; char* str = Conn("asdf", "adf")结果就是

无知人生,记录点滴 6670

关于#和##

在C语言的宏中,#的功能是将其后面的宏参数进行字符串化操作(Stringfication),简单说就是在对它所引用的宏变量通过替换后在其左右各加上一个双引号。比如下面代码中的宏:  #defineWARN_IF(EXP)        \         do{ if(EXP)        \                fprintf(stderr, "Warning: " #EXP

东川 490
上一篇: arm汇编----数据定义伪操作
下一篇: scanf 读取一个整数,输入却为小数的情况
你板子冒烟了
博客等级 码龄8年 1278粉丝 582原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值