背景

总所周知,代码量稍微大一点的C/C++项目的一些宏定义都会比较复杂,有时候会嵌套多个#if/#else判断分支和一堆#ifdef/#undef让你单看代码的话很难判断出宏定义的具体内容。
如果有一种机制能够帮助我们在构建期间打印出宏的实际内容,就能帮我们更快地捋清楚代码逻辑。

#pragma message

如#pragma message 定义所说,可以使用它来打印一个字面意义的字符串:

#pragma message("消息文本")

而我们知道宏定义里可以使用#将宏定义字符串化;借用这种机制我们可以将使用如下宏定义来便捷地在编译期间打印宏定义:

#define    PRINT_MACRO_HELPER(x)  #x
#define    PRINT_MACRO(x)         #x"="PRINT_MACRO_HELPER(x)
//使用该方式打印出编译信息
#pragma message(PRINT_MACRO(YOUR_MACRO))

例子

#include <iostream>#define PRINT_MACRO_HELPER(x)   #x
#define PRINT_MACRO(x)   #x "=" PRINT_MACRO_HELPER(x)#define NUMBER_MACRO 3.14159
#define STRING_MACRO "This is a string."#pragma message(PRINT_MACRO(NUMBER_MACRO))
#pragma message(PRINT_MACRO(STRING_MACRO))
#pragma message(PRINT_MACRO(UNDEF_MACRO))int main(int argc, char** argv)
{return 0;
}

编译过程中输出:
:::info
NUMBER_MACRO=3.14159
STRING_MACRO=“This is a string.”
UNDEF_MACRO=UNDEF_MACRO
:::

编译阶段打印宏定义的内容相关推荐

  1. 【C 语言】编译过程 分析 ( 预处理 | 编译 | 汇编 | 链接 | 宏定义 | 条件编译 | 编译器指示字 )

    相关文章链接 : 1.[嵌入式开发]C语言 指针数组 多维数组 2.[嵌入式开发]C语言 命令行参数 函数指针 gdb调试 3.[嵌入式开发]C语言 结构体相关 的 函数 指针 数组 4.[嵌入式开发 ...

  2. C++编译预处理:宏定义指令、文件包含指令和条件编译指令

     ◆ 不带参数的宏定义:用来产生与一个字符串(即宏名)对应的常量字符串,格式为:    #define 宏名 常量串 ◆ 带参数的宏定义:带参宏定义的形式很象定义一个函数,格式为:    #def ...

  3. c语言编译时打印宏的值

    #pragma message只能打印字符串 "#"可以把内容变成字符串 #define TEST 5 #define PRINT_MACRO_HELPER(x) #x #defi ...

  4. 使用OutputDebugString实现打印宏定义

    OutputDebugString输出调试信息的时候一般是在DEBUG模式下,不过如果不加控制条件,在release模式下也可以使用 OutputDebugStringA输出普通字符串的数据信息 Ou ...

  5. Verilog hdl 宏定义编译报错

    1.今天使用quartus 9.1 编译文本文件使用宏定义时编译器报错,不使用则正确.原因不明. 如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 ...

  6. C语言宏定义用法总结

    前言 最近在看源代码与开发项目的时候经常会遇到一些特殊的宏用户,接接触时感觉有点奇怪,其实是自己没有全面的熟悉宏的用法.在查阅完相关的材料后,写下这一篇总结,以期待以后忘记的时候可以重新打开回忆起里面 ...

  7. VC预处理指令与宏定义的妙用

    VC中预处理指令与宏定义的妙用 刚接触到MFC编程的人往往会被MFC 向导生成的各种宏定义和预处理指令所吓倒,但是预处理和宏定义又是C语言的一个强大工具.使用它们可以进行简单的源代码控制,版本控制,预 ...

  8. c/c++宏函数的定义与使用(宏定义函数)(macro definition)

    文章目录 为什么要使用宏函数? 什么是宏 如何使用宏 宏的定义 不带参数的宏 带参数的宏(假参数,不是真正的参数,只是替换而已) 原理 对了,如果宏函数与函数名称相同,优先使用宏定义函数 为什么要使用 ...

  9. union共用体(联合体)、宏定义、枚举

    一.共用体 定义和用法与结构体基本相同,不同的是,结构体中多个不同的放在一起,而共用体是定义的对个变量对应同一个东西,而用不同的去访问,可以得到相同的结果.当多个可以同时使用时选用结构体,当只能任选其 ...

最新文章

  1. 树莓派 修改config.txt配置文件
  2. 【机器视觉】 dev_update_time算子
  3. sqlserver改主键初始ID
  4. redis缓存跟数据库数据不一致问题解决
  5. java log4j 实例_log4j使用例子 - 小代码2016的个人页面 - OSCHINA - 中文开源技术交流社区...
  6. 计算复杂数学表达式的值
  7. eclipse—安装ADT插件搭建安卓开发环境
  8. AlwaysOn业务IP和高可用IP分开使用(四)
  9. mt4代理服务器存放文件,mt4如何保存设置好的指标?
  10. (五十七)方差分析与相关分析
  11. 【组合优化】旅行商问题Traveling Salesman Problem(TSP)-约束定义
  12. python期货数据 库_如何用python或者基于vnpy框架将期货tick数据聚合成1分钟数据呢?...
  13. 网页制作学习3----实现连缀功能
  14. 星起航:抖音小店体验分低怎么办,如何提高店铺体验评分?
  15. 【龙芯1c库】封装CAN接口和使用示例
  16. C++ 11 14 RAII经典用法
  17. 扰人的异常:net.sf.json.JSONException: Object is null
  18. 2-12 输出华氏-摄氏温度转换表 (15 分)
  19. Hadoop(三)读写流程
  20. 腾讯种的黄瓜番茄你吃过吗?

热门文章

  1. 龙志勇:云游戏的量变与质变 | WISE2022峰会演讲实录
  2. PPT高手常掉进的7个陷阱(下)
  3. 计算机基础应用电子教案,计算机应用基础电子教案——熊德明
  4. 揭秘618流量营销模式,天猫一小时打造阵仗浩大的立体全包围
  5. checkmarx : Input path not canocalized 问题解决方法
  6. 扫描版PDF添加目录
  7. Vue中keep-alive原理
  8. 【题解】「JOISC 2016 Day 3」回转寿司
  9. math: 车辆转弯半径/akerman结构转弯半径
  10. 解决如何删除打印机端口及驱动