当前位置: 首页 > news >正文

C语言中“#“和“##“的用法

1. 前言

# :把宏参数变为一个字符串,

##:把两个宏参数贴合在一起.

2. 一般用法

#include<stdio.h>

#define toString(str) #str //转字符串

#define conStr(a,b) (a##b)//连接

int main()

{

    printf(toString(12345)):        //输出字符串"12345

    printf("\n%d\n",conStr(1, 3));  //输出int 13

    return 0;

}

3. 注意事项

当一个宏的传入参数是另一个宏的时候,需要注意的是凡宏定义里有用#或##的地方,作为参数的那个宏是不会再展开的,即,只有当前宏生效, 参数里的宏!不!会!生!效!!!!

3.1 举例

#include<stdio.h>

#define toString(str) #str //转字符串

#define conStr(a,b) (a##b)//连接

#define AGE 18

int main(void)

{

    printf("str is:%s", toString(AGE)); //输出字符串“AGE”而不是18

    //printf("\n%s",conStr(AGE,AGE)); //语法错误 --- AGEAGE未申明的标识符

    return 0;

}

两句print会被展开为:

    printf("str is:%s", "AGE");

    printf("\n%s",AGEAGE);

分析: 
由于AGE是宏,且作为宏toString和conStr的参数,并且宏conStr和toString中均含有#或者##符号,所以AGE不能被再次展开。导致不符合预期的情况出现。

3.2 解决方案

解决这个问题的方法很简单,多加一层中间转换宏。

加这层宏的用意是把所有宏的参数在这层里全部展开,那么在转换宏里就会先得到宏参数的值,然后再传递给后续的宏

#include<stdio.h>

#define _toString(str) #str //转字符串

#define toString(str)  _toString(str)

#define _conStr(a,b) (a##b)//连接

#define conStr(a,b) _conStr(a,b)

#define AGE 18

结果:

printf('str is:%s', toString(AGE))

//输出为: str is: 18

//toString(AGE) -> _toString(18) ->"18”

printf("n%d",conStr(AGE, AGE));

//输出为1818

//conStr(AGE,AGE) -> conStr(18,18) ->1818

http://www.lryc.cn/news/309825.html

相关文章:

  • Linux命令-clock命令(用于调整 RTC 时间)
  • 编程笔记 Golang基础 045 math包
  • [Java 探索者之路] 一个大厂都在用的分布式任务调度平台
  • 基于JAVA springboot+mybatis智慧生活分享平台设计和实现
  • 详细了解C++中的namespace命名空间
  • #WEB前端(HTML属性)
  • LeetCode---【和的操作】
  • Docker容器与虚拟化技术:OpenEuler 使用 docker-compose 部署 LNMP
  • 13-微服务初探-自研微服务框架
  • LeetCode——二叉树(Java)
  • LDR6328芯片:智能家居时代的小家电充电革新者
  • 用node写后端环境运行时报错Port 3000 is already in use
  • Git 如何上传本地的所有分支
  • 【airtest】自动化入门教程(一)AirtestIDE
  • ChatGPT支持下的PyTorch机器学习与深度学习技术应用
  • Springboot+vue的医药管理系统(有报告)。Javaee项目,springboot vue前后端分离项目。
  • C语言:预处理
  • 计算机网络:路由协议
  • 经典动态规划题目leetcode322. 零钱兑换
  • python 使用curl_cffi 绕过jax3指纹-Cloudflare 5s盾
  • Python3学习笔记39-passlib
  • Matlab 机器人工具箱 动力学
  • Android ShellUtils手机管理器
  • 《梦幻西游》本人收集的34个单机版游戏,有详细的视频架设教程,值得收藏
  • 吴恩达机器学习全课程笔记第六篇
  • ue4.27 发现 getRandomReachedLocation 返回 false
  • 【C++ AVL树】
  • 记录一次架构优化处理性能从3千->3万
  • c++二进制位运算使用方法
  • TypeScript之JSON点语法调用