打印宏

如何打印宏

如何打印宏
1. 问题描述
2. 分析思路
3. 总结

1. 问题描述

我们都知道,在C/C++中经常会用到宏定义,宏实际上就是给一个字段取的一个别名,它是属于预编译系统的一部分,其形式如:

  1. #define PI 3.141592654

当我们想要使用3.141592654这个值的时候,直接用它的别名PI就可以了。如果什么时候,我们需要将PI的精度提高,则只需要修改这个宏定义就可以了,而不用一个一个的去修改。

同时,宏是没有类型的,在预编译时,系统对它只是完全的字符替换而已,例如:

  1. #define SQR(x) x*x
  2. int main()
  3. {
  4. int a=SQR(5+3);
  5. printf("the result is:%d",a);
  6. return 0;
  7. }

在预编译后,代码相当于:

  1. int main()
  2. {
  3. int a=5+3*5+3;
  4. printf("the result is:%d\n",a);
  5. return 0;
  6. }

结果是:the result is:23

因为宏是没有类型的,编译后只是简单字符的替换,那如果我想将PI以字符串的形式打印出来呢,该如何操作?

其实这还不好操作,直接将一个字符串取一个别名如:

  1. #define HELLO "hello World!"
  2. int main()
  3. {
  4. printf("the string is:%s",HELLO);
  5. return 0;
  6. }

结果是:the string is:hello World!

既然这样,那就再问一个问题,如果一开始你就跟本不知道定义的宏是个字符串形式呢?如:

  1. #define PI 3.141592654

我依然想将3.141592654打印出来,该如何操作呢?

2. 分析思路

需要将宏打印出来,其实就是将#define PI 3.141592654转换成#define PI “3.141592654”

在这里需要用到#符号,它是一个预处理运算法,作用是将语言符号转化成字符串。然后先来实验下:

  1. #include<stdio.h>
  2. #define PI 3.141592654
  3. #define str(s) #s
  4. int main()
  5. {
  6. printf("printf:%s\n",str(PI));
  7. return 0;
  8. }

然后进行预编译命令:

gcc -E test.c -o test.i

编译后得到的test.i文件就是预编译后的文件,打开查看里面有如下内容:

  1. int main()
  2. {
  3. printf("printf:%s\n","PI");
  4. return 0;
  5. }

我们要的是3.141592654,而不是PI字符串,所以需要再加个宏定义,具体如下:

  1. #include<stdio.h>
  2. #define PI 3.141592654
  3. #define xstr(s) str(s)
  4. #define str(s) #s
  5. int main()
  6. {
  7. printf("printf:%s\n",xstr(PI));
  8. return 0;
  9. }

同样按前面的方式进行预编译,得到的预编译文件大体如下:

  1. int main()
  2. {
  3. printf("printf:%s\n","3.141592654");
  4. return 0;
  5. }

通过它编译出来的程序,执行结果如下:

  1. [email protected]-Lenovo-Product:/local/sdb/tempFile/cTest$ ./test.o
  2. printf:3.141592654

3. 总结

这个问题也是无意中看到的,在解决一个问题时,当时是希望将宏写入到编译后的文件中(即编译后文件会分配空间并存储该宏的内容),具体如图所示:

然后发现有使用打印宏的这个功能,感觉比较有趣,做个笔记方便后面查询。

null

时间: 2024-11-10 08:18:22

打印宏的相关文章

C语言:类似linux内核的分等级DEBUG宏(打印宏)

总结几种log打印printf函数的宏定义 http://blog.chinaunix.net/uid-20564848-id-73402.html #include <stdio.h> #define lU_DEBUG_PREFIX "##########" #define LU_DEBUG_CMD 0x01 #define LU_DEBUG_DATA 0x02 #define LU_DEBUG_ERROR 0x04 #define LU_PRINTF_cmd(msg..

gcc编译期打印宏的值

如果我们想知道一个宏的值应该怎么办? 要么在代码里加一句printf 要么在编译的时候gcc -E 第一种方法需要程序运行起来,颇为麻烦 第二种方法无法应付下面这些情况 比如宏的值等于sizeof(struct xxoo) 比如宏本身就是一个复杂的运算(((2U) << (((0+8)+8)+13)) | ((('W')) << (0+8)) | (((7)) << 0) | (((((sizeof(int) == sizeof(int[1]) && s

c++编译时打印宏定义

#pragma message("this is message") #pragma message只能打印字符串,如果想打印任何宏定义可使用: #define PRINT_MACRO_HELPER(x) #x #define PRINT_MACRO(x) #x"="PRINT_MACRO_HELPER(x) #pragma message(PRINT_MACRO(var)) 如:#define __cplusplus 199911L #pragma message

typedef 类型重命名 和 #define 宏定义(1)

http://www.blogjava.net/jasmine214--love/archive/2010/11/29/339307.html 在现实生活中,信息的概念可能是长度,数量和面积等.在C语言中,信息被抽象为int.float和double等基本数据类型.从基本数据类型名称上, 不能够看出其所代表的物理属性,并且int.float和double为系统关键字,不可以修改.为了解决用户自定义数据类型名称的需求,C语言中引入类 型重定义语句typedef,可以为数据类型定义新的类型名称,从而

C语言宏#和##

C语言宏#和## 一.基本用途 #用于将宏定义中的参数转换为字符串.例:存在宏#define TO_STRING(x) #x则TO_STRING(hello)展开为"hello" ##用于拼接Token.例:存在宏#define DECLARE_HANDLER(x) x##_handler则DECLARE_HANDLER(foo)展开为foo_handler 二.打印出展开后的宏 #define TO_STRING(x) #x#define MACRO_TO_STRING(macro)

C/C++ 打印文件名、行号、函数名的方法

转自:http://blog.csdn.net/cabinriver/article/details/8960119 今天跟踪一段开源代码的时候,因为对代码不太熟悉,所以要打印一些关键的信息.便顺手整理了一下这个能打印文件名.行号.函数名的宏. 1.打印文件名.行号.函数的两种方式 [cpp] view plain copy /************************************************************************** *  @Copyri

嵌入式C语言自我修养 12:有一种宏,叫可变参数宏

12.1 什么是可变参数宏 在上面的教程中,我们学会了变参函数的定义和使用,基本套路就是使用 va_list.va_start.va_end 等宏,去解析那些可变参数列表我们找到这些参数的存储地址后,就可以对这些参数进行处理了:要么自己动手,自己处理:要么继续调用其它函来处理. void print_num(int count, ...) { va_list args; va_start(args,count); for(int i = 0; i < count; i++) { printf(&qu

为Excel电子表格添加快速打印功能按钮的方法

对于需要频繁切换打印机来完成打印工作的人来说,切换打印机的重复操作非常繁琐且没有效率.其实微软早就为大家准备了各种解决重复劳动的各种工具,比如“快速访问工具栏”和“宏”.下面笔者就跟大家来讲讲如何利用这两个工具来为Excel电子表格添加快速打印的功能按钮,只要轻轻点击一下这个按钮,内容就会发送至指定的打印机进行打印,而不用管当前默认的打印机是哪一台. 一.添加“快速打印”功能按钮 首先打开Excel电子表格,点开窗口左上角下拉箭头的“自定义快速访问工具栏”,然后选择相应的功能即可.比如我们选择“

c++中的const关键字的理解

看effective c++第二版推荐使用const,少用define.今天才发现发现这远远不够. #define定义的常量在预处理替换,debug的时候无法打印宏的,这种常量设置是有缺陷的, const定义常量作用在编译时期,就是说编译器帮你检查有没有对const做修改,那么怎么实现一个运行时常量,目前c++中还没有提供改语法.所以const只是个协议.库提供者和使用者之间的协议,开发者和编译器的协议.所以有了const_static可以消除const的协议 开发者和编译器的协议: const