实现一个TODO宏
2016-05-24 11:37
441 查看
get 新技能 :原文地址:http://blog.sunnyxx.com/2015/03/01/todo-macro/
实现一个能产生warning的TODO宏,用于在代码里做备忘,效果:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201908/25/eb0b351f348fe35d77b7c68e1a91aaa8.jpg)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201908/25/f44a6f3193e92458e434691cf94636ce.jpg)
下面一步步来实现这个宏。
手动让编译器报警(报错)可以用以下几个方法:
但我们知道,带
利用这个特性,我们就可以将warning定义成宏
接下来,我们让这个宏能够接受入参,并显示到warning中去,这里会面临宏的基本用法的考验。
个人认为不太可能在一个宏定义中完成这件事,需要用到辅助宏:
这时,一个基本功能的TODO宏就完成了,下面向其中加入额外的信息:
其中涉及到的知识:
两个常量字符串可以拼接成一个整串 “123””456” => “123456”
使用到3个预定义宏,
在字符串中预定义宏应延时展开,如果将上面的
为了美化,warning message中可以使用
于是,使用
其实到这步已经OK了,为了让这个宏更加抢眼,还可以借鉴RAC,把宏定义成前面加
将最终的宏定义前面加上上面的宏后,使用时就可以加
除此之外,还研究了半天如何在宏里面定义一个注释,这样就可以偷偷写
![](https://oscdn.geek-share.com/Uploads/Images/Content/201908/25/337d551a6de6878513be4480a5a18ec1.jpg)
但很可惜没有找到一个可行的方法,欢迎一起解决。
Xcode插件《XTodo》也是利用这个特性,可以尝试下。
如果需要一个产生error的宏,将这里替换成这样就好了:
同时,上面的代码在《github上》可以找到。也欢迎关注微博@我就叫Sunny怎么了一起交流。
http://clang.llvm.org/docs/UsersManual.html
https://gcc.gnu.org/onlinedocs/cpp/Pragmas.html
实现一个能产生warning的TODO宏,用于在代码里做备忘,效果:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201908/25/eb0b351f348fe35d77b7c68e1a91aaa8.jpg)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201908/25/f44a6f3193e92458e434691cf94636ce.jpg)
下面一步步来实现这个宏。
Let’s do it
手动让编译器报警(报错)可以用以下几个方法: #warning sunnyxx #error sunnyxx #pragma message "sunnyxx" #pragma GCC warning "sunnyxx" #pragma GCC error "sunnyxx" |
#的预处理指令是无法被
#define的。好在C99提供了一个
_Pragma运算符可以把部分
#pragma指令字符串化:
#pragma message "sunnyxx" // 等价于 _Pragma("message \"sunnyxx\"") // 需要注意双引号的转义 // 或 _Pragma("message(\"sunnyxx\")") // 需要注意双引号的转义 |
#define SOME_WARNING _Pragma("message(\"报告大王!\")") int main() { SOME_WARNING // [!]报告大王! return 1; } |
#define STRINGIFY(S) #S #define PRAGMA_MESSAGE(MSG) _Pragma(STRINGIFY(message(MSG))) |
STRINGIFY(S)将入参转化成字符串,省去了
_Pragma中全串加转义字符的困扰。
这时,一个基本功能的TODO宏就完成了,下面向其中加入额外的信息:
// 两个已有的宏 |
两个常量字符串可以拼接成一个整串 “123””456” => “123456”
使用到3个预定义宏,
__COUNTER__宏展开次数的计数器,全局唯一;
__FILE__当前文件完整目录字符串;
__LINE__在当前文件第几行
在字符串中预定义宏应延时展开,如果将上面的
DEFER_STRINGIFY换成
STRINGIFY的话,如
__LINE__就不能被正确展开成行数,而是成了一个常量字符串
"__LINE__"
为了美化,warning message中可以使用
\n换行
于是,使用
FORMATTED_MESSAGE(MSG)宏就可以将带文件路径、序号、行数等信息加入到最终的warning中。
其实到这步已经OK了,为了让这个宏更加抢眼,还可以借鉴RAC,把宏定义成前面加
@的形式:
#define KEYWORDIFY try {} @catch (...) {} |
@前缀了(空的try-catch会被编译器优化,所以没啥性能损耗)
最终版本
#define STRINGIFY(S) #S |
What’s more
除此之外,还研究了半天如何在宏里面定义一个注释,这样就可以偷偷写// TODO: ...的注释,让Xcode导航栏中也出现这个TODO了:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201908/25/337d551a6de6878513be4480a5a18ec1.jpg)
但很可惜没有找到一个可行的方法,欢迎一起解决。
Xcode插件《XTodo》也是利用这个特性,可以尝试下。
如果需要一个产生error的宏,将这里替换成这样就好了:
_Pragma(STRINGIFY(GCC error(MSG)))
同时,上面的代码在《github上》可以找到。也欢迎关注微博@我就叫Sunny怎么了一起交流。
References
http://clang.llvm.org/docs/UsersManual.htmlhttps://gcc.gnu.org/onlinedocs/cpp/Pragmas.html
相关文章推荐
- 用devstack快速部署 openstack
- LeetCode:Combinations
- ceph存储 ceph中pglog处理流程
- mybatis学习笔记(七)增删改查
- [leetcode] 350. Intersection of Two Arrays II
- Activity和Service的生命周期(图)
- cygwin 安装以及配置
- 欢迎使用CSDN-markdown编辑器
- 汉字转全拼
- Google I/O 2016 RecyclerView的前世今生,原理详解等
- eclipse配置external tool configurations外部工具
- (HDU 1010) Tempter of the Bone
- Visio画好的图在word中只显示一部分
- 百度地图坐标系和火星坐标系之间的互相转换
- java调用windows的wmi获取设备性能数据
- WebView的分析与使用
- liblinphone注册状态的变化
- LeetCode 350:Intersection of Two Arrays II
- 【前端】优酷、酷6、土豆网视频自动播放代码
- web前端开发命名规则