讲师中心 微信公众号
AI工具推荐 视频效率加速

c++中预处理器(preprocessor)的字符串化(#)和标记粘贴(##)有什么用? (宏技巧)

浅萱君_6758

浅萱君_6758

发布时间:2026-01-21 17:12:09

|

762人浏览过

|

来源于php中文网

原创

<h1>将宏参数原样转为字符串字面量,不展开、不求值;## 拼接两个标记为新标识符,拼接前各自先展开。二者常组合用于调试宏,需注意展开顺序与空参数处理。</h1>

c++中预处理器(preprocessor)的字符串化(#)和标记粘贴(##)有什么用? (宏技巧)

字符串化操作符 # 用来把宏参数转成字符串字面量

它只在宏定义内部有效,作用是把传入的**预处理标记(token)原样包裹成双引号字符串**,不是运行时转换,也不做类型检查或求值。

常见错误是以为 # 能处理变量名以外的东西,比如表达式或带空格的片段——它会直接报错或拼出非法字符串。

  • # 后必须紧跟宏参数名,不能加空格,如 #x 合法,# x 非法
  • 参数若本身是另一个宏,在字符串化前**不会展开**,除非先用中间宏“触发一次展开”
  • 适合日志、调试输出、生成结构体字段名字符串等场景
#define STR(x) #x
#define X 123
STR(X)     // 展开为 "X",不是 "123"
STR(abc)   // 展开为 "abc"
STR(int a) // 展开为 "int a" —— 注意空格也被保留

标记粘贴操作符 ## 用于拼接两个预处理标记

它把左右两边的 token 合并成一个新的合法标识符(identifier),常用于生成变量名、函数名或枚举值。失败时预处理器直接报错,比如拼出非法符号(## 两端不能是纯数字或含运算符)。

容易忽略的是:## 两侧 token 在拼接前**各自已完成宏展开**(除非被 # 或另一个 ## 阻止),这点和 # 行为不同。

立即学习“C++免费学习笔记(深入)”;

Miller CSV TSV JSON 数据处理器
Miller CSV TSV JSON 数据处理器

Miller (mlr) 是一个命令行工具,用于查询、整形和重新格式化名称索引数据,如 CSV、TSV、JSON 和 JSON Lines。它将 awk、sed、cut、join 和 sort 的功能整合到一个专为结构化数据处理而构建的单一工具中。

下载
  • 不能出现在宏定义开头或结尾,如 ##x 或 x## 非法
  • 如果某侧展开为空,需用“空宏”配合 ## 实现条件拼接(例如可选后缀)
  • 常用在泛型模拟、事件注册、状态机跳转标签生成中
#define CONCAT(a, b) a##b
#define PREFIX ver
CONCAT(PREFIX, 2)   // 展开为 ver2
CONCAT(ver, 2)      // 同样是 ver2
#define EMPTY
CONCAT(foo, EMPTY)  // 展开为 foo(EMPTY 展开为空,## 消除空隙)

组合使用 # 和 ## 实现调试宏

真实项目里它们常一起出现,比如打印变量名和值:# 把参数名变字符串,## 拼出临时变量避免命名冲突,或区分不同作用域的同名变量。

最典型的坑是“展开顺序”:想让参数先展开再字符串化,得套一层宏;否则直接 #x 拿到的是原始形参名。

  • 写两层宏是惯用解法:STR(x) → STR_IMPL(x) → #x
  • ## 在宏参数为空时可能产生孤立的 ##,GCC/Clang 支持 ##__VA_ARGS__ 消除逗号,但标准 C++ 中需谨慎
  • 不要试图用它们生成字符串字面量再传给 printf 的格式串——那是运行时行为,预处理器不参与
#define STR_IMPL(x) #x
#define STR(x) STR_IMPL(x)
#define VAR_NAME(x) x##_t
STR(STR)           // "STR",不是 "STR_IMPL"
VAR_NAME(int)      // int_t

预处理器宏不是万能的,# 和 ## 尤其受限

它们只在翻译阶段第 4 步(宏替换)起作用,无法访问类型信息、作用域或模板实例化结果。现代 C++ 更推荐 constexpr、模板别名或属性(如 [[maybe_unused]])替代部分宏用途。

真正难调试的不是语法错误,而是展开后语义突变:比如拼出的函数名在链接时找不到,或字符串化后的名字和实际变量名大小写不一致,导致断点失效或日志误导。

热门AI工具

更多
DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

相关专题

更多
java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

5764

2023.10.24

Go语言中的运算符有哪些
Go语言中的运算符有哪些

Go语言中的运算符有:1、加法运算符;2、减法运算符;3、乘法运算符;4、除法运算符;5、取余运算符;6、比较运算符;7、位运算符;8、按位与运算符;9、按位或运算符;10、按位异或运算符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2364

2024.02.23

php三元运算符用法
php三元运算符用法

本专题整合了php三元运算符相关教程,阅读专题下面的文章了解更多详细内容。

1592

2025.10.17

登录token无效
登录token无效

登录token无效解决方法:1、检查token的有效期限,如果token已经过期,需要重新获取一个新的token;2、检查token的签名,如果签名不正确,需要重新获取一个新的token;3、检查密钥的正确性,如果密钥不正确,需要重新获取一个新的token;4、使用HTTPS协议传输token,建议使用HTTPS协议进行传输 ;5、使用双因素认证,双因素认证可以提高账户的安全性。

11986

2023.09.14

登录token无效怎么办
登录token无效怎么办

登录token无效的解决办法有检查Token是否过期、检查Token是否正确、检查Token是否被篡改、检查Token是否与用户匹配、清除缓存或Cookie、检查网络连接和服务器状态、重新登录或请求新的Token、联系技术支持或开发人员等。本专题为大家提供token相关的文章、下载、课程内容,供大家免费下载体验。

1445

2023.09.14

token怎么获取
token怎么获取

获取token值的方法:1、小程序调用“wx.login()”获取 临时登录凭证code,并回传到开发者服务器;2、开发者服务器以code换取,用户唯一标识openid和会话密钥“session_key”。想了解更详细的内容,可以阅读本专题下面的文章。

3197

2023.12.21

token什么意思
token什么意思

token是一种用于表示用户权限、记录交易信息、支付虚拟货币的数字货币。可以用来在特定的网络上进行交易,用来购买或出售特定的虚拟货币,也可以用来支付特定的服务费用。想了解更多token什么意思的相关内容可以访问本专题下面的文章。

5361

2024.03.01

printf用法大全
printf用法大全

php中文网为大家提供printf用法大全,以及其他printf函数的相关文章、相关下载资源以及各种相关课程,供大家免费下载体验。

628

2023.06.20

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

20

2026.09.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
夸克AI浏览器使用手册
夸克AI浏览器使用手册

共0课时 | 0人学习

jQuery官方API文档
jQuery官方API文档

共0课时 | 0人学习

Manus AI 入门手册
Manus AI 入门手册

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn