背景

总所周知,代码量稍微大一点的C/C++项目的一些宏定义都会比较复杂,有时候会嵌套多个#if/#else判断分支和一堆#ifdef/#undef让你单看代码的话很难判断出宏定义的具体内容。

如果有一种机制能够帮助我们在构建期间打印出宏的实际内容,就能帮我们更快地捋清楚代码逻辑。

message pragma

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

#pragma message("消息文本")

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

#define    PRINT_MACRO_HELPER(x)  #x
#define PRINT_MACRO(x) #x"="PRINT_MACRO_HELPER(x) #pragma message(PRINT_MACRO(YOUR_MACRO))

如果YOUR_MACRO是有被定义的,则打印:

note: #pragma message: YOUR_MACRO=xxx

YOUR_MACRO未定义,则打印:

note: #pragma message: YOUR_MACRO=YOUR_MACRO

举个栗子:

编译test_macro_msg.cpp:

#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;
}

编译过程中输出:

> g++ cstr2string.cpp -o cstr2string
cstr2string.cpp:9:42: note: #pragma message: NUMBER_MACRO=3.14159
#pragma message(PRINT_MACRO(NUMBER_MACRO))
^
cstr2string.cpp:10:42: note: #pragma message: STRING_MACRO="This is a string."
#pragma message(PRINT_MACRO(STRING_MACRO))
^
cstr2string.cpp:11:41: note: #pragma message: UNDEF_MACRO=UNDEF_MACRO
#pragma message(PRINT_MACRO(UNDEF_MACRO))
^

gcc编译阶段打印宏定义的内容的更多相关文章

  1. c++编译时打印宏定义

    #pragma message("this is message") #pragma message只能打印字符串,如果想打印任何宏定义可使用: #define PRINT_MAC ...

  2. 查看GCC的内置宏定义

    开发过程中我们常常需要使用宏定义.. 为了尽可能多的使用GCC为我们提供的特性,首先我们需要知道gcc提供了那些特性... gcc -dM -E - < /dev/null 没错,就这么一句话就 ...

  3. 获取gcc和clang的内置宏定义

    下面是对Gcc的内置宏定义的解释: https://gcc.gnu.org/onlinedocs/cpp/Common-Predefined-Macros.html https://github.co ...

  4. gcc编译c语言程序

    编译:当前源代码编译成二进制目标文件(.obj文件) 链接(link):将生成的.obj文件与库文件.lib等文件链接,生成可执行文件(.exe文件).   一个现代编译器的主要工作流程如下: 源程序 ...

  5. gcc 编译 + 选项【转】

    转自:http://blog.csdn.net/princess9/article/details/6567678 一般来说要现有项目中的编译选项,设置新的project的编译选项 编译器 就是将“高 ...

  6. gcc 编译 c++ 程序(转载)

    单个源文件生成可执行程序 下面是一个保存在文件 helloworld.cpp 中一个简单的 C++ 程序的代码: /* helloworld.cpp */ #include <iostream& ...

  7. VC中预处理指令与宏定义详解

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

  8. GCC编译过程与动态链接库和静态链接库

    1. 库的介绍 库是写好的现有的,成熟的,可以复用的代码.现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常. 本质上来说库是一种可执行代码的二进制形式,可 ...

  9. Makefile中进行宏定义-***

    实际上是gcc命令支持-D宏定义,相当于C中的全局#define: gcc -D name gcc -D name=definition Makefile中可以定义变量(和宏很像),但是是给make解 ...

随机推荐

  1. 免费在线使用Ayoa:让思维导图更简单

    在学习和工作中,我们都会遇到需要使用思维导图的情况,导图可以很好地帮助我们处理工作,完成记录和分享,是一个非常便捷的工具.今天小编就想和大家分享一款非常简单好用的思维导图软件,Ayoa. 之所以要将它 ...

  2. symfony框架学习

    http://mozilla.com.cn/thread-52722-1-1.html安装网页翻译插件 symfony2是基于php的web框架 http://www.chrisyue.com/sym ...

  3. windows创建隐藏用户的powershell脚本

    通过保存并重新注册已删除用户的注册表的方式来隐藏用户,未登录时登陆界面不可见,登陆后可见 方法详情见: https://www.k0rz3n.com/2018/06/26/windows%E6%B8% ...

  4. Java(8)I/O

    目录 一.File类 1.File类概述 2.File类实例化 3.File类常用方法 二.IO流的原理 1.IO流的原理 2.input和output的理解 三.IO流的分类 1.分类 2.图示 3 ...

  5. Linux初学学习笔记 -----正则表达式和通配符

    简单来说通配符是用来匹配文件名和目录而正则表达式是用来匹配文本内容的 常用的通配符 *:匹配任意多个字符 下面的是以p为开头的目录里面的文件 ?:匹配任意一个字符 [-]:匹配括号内出现的任意一个字符 ...

  6. FPGA 串口

    VerilogHDL那些事儿_建模篇(黑金FPGA开发板配套教程) 作者:akuei2 说明:参照该书将部分程序验证学习一遍 学习时间:2014年5月3号 主要收获: 1. 对串口有初步了解: 2. ...

  7. 20190626_二次开发BarTender打印机_C#代码_一边读取TID_一边打印_打印机POSTEK

    demo代码如下: private void btnPrint_Click(object sender, EventArgs e) { if (this.btnPrint.Text == " ...

  8. 一千行MySQL命令

    基本操作 /* Windows服务 */ -- 启动MySQL net start mysql -- 创建Windows服务 sc create mysql binPath= mysqld_bin_p ...

  9. 老猿学5G:融合计费基于流计费的触发器Triggers

    ☞ ░ 前往老猿Python博文目录 ░ 一.概述 每个触发条件都是一个可计费事件.SMF中的功能体CTF在用户上网时达到一定条件就会向CHF上报流量,而CTF什么时候触发流量上报是由CTF中的触发器 ...

  10. moviepy音视频剪辑:颜色相关变换函数blackwhite、colorx、fadein/out、gamma_corr、invert_colors、lum_contrast、mask_color介绍

    ☞ ░ 前往老猿Python博文目录 ░ 一.引言 在<moviepy音视频剪辑:moviepy中的剪辑基类Clip详解>介绍了剪辑基类的fl.fl_time.fx方法,在<movi ...