实现一个TODO宏

简介:

实现一个TODO宏

实现一个能产生warning的TODO宏,用于在代码里做备忘,效果: 


下面一步步来实现这个宏。


Let’s do it

手动让编译器报警(报错)可以用以下几个方法: 

1
2
3
4
5
#warning sunnyxx
#error sunnyxx
#pragma message "sunnyxx"
#pragma GCC warning "sunnyxx"
#pragma GCC error "sunnyxx"

但我们知道,带#的预处理指令是无法被#define的。好在C99提供了一个_Pragma运算符可以把部分#pragma指令字符串化: 

1
2
3
4
5
#pragma message "sunnyxx"
// 等价于
_Pragma("message \"sunnyxx\"") // 需要注意双引号的转义
// 或
_Pragma("message(\"sunnyxx\")") // 需要注意双引号的转义

利用这个特性,我们就可以将warning定义成宏

1
2
3
4
5
#define SOME_WARNING _Pragma("message(\"报告大王!\")")
int main() {
    SOME_WARNING // [!]报告大王!
    return 1;
}

接下来,我们让这个宏能够接受入参,并显示到warning中去,这里会面临宏的基本用法的考验。 

1
2
#define STRINGIFY(S) #S
#define PRAGMA_MESSAGE(MSG) _Pragma(STRINGIFY(message(MSG)))

个人认为不太可能在一个宏定义中完成这件事,需要用到辅助宏:STRINGIFY(S) 将入参转化成字符串,省去了_Pragma中全串加转义字符的困扰。
这时,一个基本功能的TODO宏就完成了,下面向其中加入额外的信息: 

1
2
3
4
5
6
7
8
// 两个已有的宏
#define STRINGIFY(S) #S
#define PRAGMA_MESSAGE(MSG) _Pragma(STRINGIFY(message(MSG)))
// 延迟1次展开的宏
#define DEFER_STRINGIFY(S) STRINGIFY(S)
// 下面的宏在第一行用`\`折行
#define FORMATTED_MESSAGE(MSG) "[TODO-" DEFER_STRINGIFY(__COUNTER__) "] " MSG " \n"  \
    DEFER_STRINGIFY(__FILE__) " line " DEFER_STRINGIFY(__LINE__)

其中涉及到的知识: 

  • 两个常量字符串可以拼接成一个整串 “123””456” => “123456”
  • 使用到3个预定义宏__COUNTER__宏展开次数的计数器,全局唯一;__FILE__当前文件完整目录字符串;__LINE__在当前文件第几行
  • 在字符串中预定义宏应延时展开,如果将上面的DEFER_STRINGIFY换成STRINGIFY的话,如__LINE__就不能被正确展开成行数,而是成了一个常量字符串"__LINE__"
  • 为了美化,warning message中可以使用\n换行

于是,使用FORMATTED_MESSAGE(MSG)宏就可以将带文件路径、序号、行数等信息加入到最终的warning中。 


其实到这步已经OK了,为了让这个宏更加抢眼,还可以借鉴RAC,把宏定义成前面加@的形式:

1
#define KEYWORDIFY try {} @catch (...) {}

将最终的宏定义前面加上上面的宏后,使用时就可以加@前缀了(空的try-catch会被编译器优化,所以没啥性能损耗)


最终版本

1
2
3
4
5
6
7
8
#define STRINGIFY(S) #S
#define DEFER_STRINGIFY(S) STRINGIFY(S)
#define PRAGMA_MESSAGE(MSG) _Pragma(STRINGIFY(message(MSG)))
#define FORMATTED_MESSAGE(MSG) "[TODO-" DEFER_STRINGIFY(__COUNTER__) "] " MSG " \n" \
DEFER_STRINGIFY(__FILE__) " line " DEFER_STRINGIFY(__LINE__)
#define KEYWORDIFY try {} @catch (...) {}
// 最终使用下面的宏
#define TODO(MSG) KEYWORDIFY PRAGMA_MESSAGE(FORMATTED_MESSAGE(MSG))

What’s more

除此之外,还研究了半天如何在宏里面定义一个注释,这样就可以偷偷写// TODO: ...的注释,让Xcode导航栏中也出现这个TODO了:

但很可惜没有找到一个可行的方法,欢迎一起解决。
Xcode插件《XTodo》也是利用这个特性,可以尝试下。

如果需要一个产生error的宏,将这里替换成这样就好了:_Pragma(STRINGIFY(GCC error(MSG)))

同时,上面的代码在《github上》可以找到。也欢迎关注微博@我就叫Sunny怎么了一起交流。

References

http://clang.llvm.org/docs/UsersManual.html
https://gcc.gnu.org/onlinedocs/cpp/Pragmas.html

目录
相关文章
|
存储 PHP 数据库
新手教程 快速部署PbootCMS到本地或者服务器
新手教程 快速部署PbootCMS到本地或者服务器
2249 0
|
7月前
|
机器学习/深度学习 人工智能 自然语言处理
构建AI智能体:六十一、信息论完全指南:从基础概念到在大模型中的实际应用
摘要: 信息论是人工智能尤其是大语言模型的核心数学工具。本文系统介绍了八大核心概念: 信息量:衡量事件意外程度,公式为I(x)=-log₂P(x) 信息熵:评估系统不确定性,H(X)=-ΣP(x)log₂P(x) 联合熵/条件熵:分析多变量关系及条件不确定性 互信息:量化变量间共享信息量 KL散度:衡量概率分布差异 交叉熵:模型训练的核心损失函数 在大语言模型中,这些概念被广泛应用于: 训练阶段:交叉熵优化预测,KL散度防止过拟合 推理阶段:温度参数调节生成文本的创造性(高熵增加多样性)
964 2
|
7月前
|
SQL 关系型数据库 数据库
分布式事务Seata
本章节深入探讨分布式事务问题,涵盖CAP定理与BASE理论,重点学习Seata框架的XA、AT、TCC及SAGA四种事务模式,掌握跨服务事务一致性解决方案,并实践高可用部署架构。
334 0
分布式事务Seata
|
人工智能 自然语言处理 数据挖掘
云上玩转Qwen3系列之三:PAI-LangStudio x Hologres构建ChatBI数据分析Agent应用
PAI-LangStudio 和 Qwen3 构建基于 MCP 协议的 Hologres ChatBI 智能 Agent 应用,通过将 Agent、MCP Server 等技术和阿里最新的推理模型 Qwen3 编排在一个应用流中,为大模型提供了 MCP+OLAP 的智能数据分析能力,使用自然语言即可实现 OLAP 数据分析的查询效果,减少了幻觉。开发者可以基于该模板进行灵活扩展和二次开发,以满足特定场景的需求。
|
7月前
|
传感器 人工智能 算法
智能之巅:AI 如何重塑第六代战斗机
近日,两架“歼-36”六代机在成都双机同框引发热议。这不仅是航空技术的突破,更标志着AI深度融入空战体系。从群体智能到“忠诚僚机”,AI正重塑战争逻辑,推动中国空军迈向“算法为王”的智能时代。
594 0
|
8月前
|
IDE 开发工具 C++
从代码到芯片:CLion 2025.1如何重构嵌入式开发全流程,安装步骤+安装包
JetBrains CLion 2025.1 是一款专业 C/C++ 跨平台 IDE,提升开发效率。支持项目外文件分析、增强调试(含 Qt 渲染)、STM32 调试优化,集成 Zephyr 构建,并免费开放 AI 助手功能,兼容主流云模型,打造智能编程体验。
623 0
从代码到芯片:CLion 2025.1如何重构嵌入式开发全流程,安装步骤+安装包
|
12月前
|
人工智能 BI 语音技术
AR眼镜+AI大模型:颠覆工业设备验收流程的智能革命
本方案结合AR眼镜与AI视觉大模型,打造高效、精准、可追溯的设备验收流程。通过第一视角记录、智能识别、结构化数据生成与智能报表功能,提升验收效率与质量,助力企业实现智能化管理。
|
机器学习/深度学习 传感器 搜索推荐
《洞察因果本质:解锁智能体大模型精准预测的底层逻辑》
因果表征学习作为新兴领域,致力于挖掘数据背后的因果结构,突破传统基于相关性的表征学习局限,为智能体大模型提供更精准的预测能力。通过揭示数据生成机制、打破相关性局限和整合多源信息,它在工业故障预测、农业产量优化、电商推荐等领域展现巨大潜力。尽管面临数据挖掘与框架融合等挑战,但其未来前景广阔,有望推动医疗、金融、智慧城市等多领域实现更深层次的理解与决策优化。
388 11
|
存储 数据挖掘 BI
数据仓库深度解析与实时数仓应用案例探析
随着数据量的不断增长和数据应用的广泛深入,数据治理和隐私保护将成为数据仓库建设的重要议题。企业需要建立完善的数据治理体系,确保数据的准确性、一致性和完整性;同时加强隐私保护机制建设,确保敏感数据的安全性和合规性。
1282 55
|
机器学习/深度学习 数据采集 人工智能
机器学习实战 | 综合项目-电商销量预估进阶方案
本篇内容是Kaggle数据科学竞赛Rossmann store sales解决方案的进阶版本,整体方案包括探索性数据分析、缺失值处理、特征工程、基准模型与评估、XGBoost建模与调优等完整板块。
4682 1
机器学习实战 | 综合项目-电商销量预估进阶方案

热门文章

最新文章