学习C语言,特别是阅读linux源码的时候,大家经常遇到很多的宏定义,有简单的,当然也有很复杂的。
有事一个宏定义甚至有几十行之多,遇到这种宏定义的大家基本上是一脸懵逼,不知所措,其实想复杂的宏定义没有去深究的价值,简短的才有深究的价值。
但是你不理解这些长的宏定义就无法接着理解接下来的代码,今天这里就叫大家一个我经常使用的方法,来理解些宏定义,将你需要理解的宏定义,新建一个.c文件,比如test.c,这时仅需要使用gcc -E test.c > test,执行之后test就是test.c展开之后的文件,也就是预处理之后的文件,里面的宏都会进行展开

我这里举例两个宏定义,并趁机说明下#和##的作用

#  将对应标致按照字面意思转换我对应的字符
## 黏贴两个标致为一个
#include <stdio.h>
#include <stdio.h>
#include <math.h> //NAN
//#的作用是将关键字转换为对应的字符
#define Peval(cmd) printf(#cmd ": %g\n", cmd);#define Setup_list(name, ...) \double *name ## _list = (double []){__VA_ARGS__, NAN}; \int name ## _len = 0; \for (name ## _len =0; \!isnan(name ## _list[name ## _len]); \) name ## _len ++;int main()
{//  测试单个#double *plist = (double[]){1, 2, 3};double list[] = {1, 2, 3};Peval(sizeof(plist)/(sizeof(double)+0.0));Peval(sizeof(list)/(sizeof(double)+0.0));// 测试双 ##Setup_list(items, 1, 2, 4, 8);double sum=0;for (double *ptr= items_list; !isnan(*ptr); ptr++)sum += *ptr;printf("total for items list: %g\n", sum);#define Length(in) in ## _lensum=0;Setup_list(next_set, -1, 2.2, 4.8, 0.1);for (int i=0; i < Length(next_set); i++)sum += next_set_list[i];printf("total for next set list: %g\n", sum);}

展开后的部分代码


int main()
{double *plist = (double[]){1, 2, 3};double list[] = {1, 2, 3};//#的作用是将关键字转换为对应的字符
#define Peval(cmd) printf(#cmd ": %g\n", cmd);//Peval(sizeof(plist)/(sizeof(double)+0.0));//展开后,可以看到,所有Peval 里面填写的标志已经经过#cmd 被转换为字符串 printf("sizeof(plist)/(sizeof(double)+0.0)" ": %g\n", sizeof(plist)/(sizeof(double)+0.0));;printf("sizeof(list)/(sizeof(double)+0.0)" ": %g\n", sizeof(list)/(sizeof(double)+0.0));;#define Setup_list(name, ...) \double *name ## _list = (double []){__VA_ARGS__, NAN}; \int name ## _len = 0; \for (name ## _len =0; \!isnan(name ## _list[name ## _len]); \) name ## _len ++;//双 ## 将两个标致会黏贴到一块double *items_list = (double []){1, 2, 4, 8, (__builtin_nanf (""))}; int items_len = 0; for (items_len =0; !__builtin_isnan (items_list[items_len]); ) items_len ++;;double sum=0;for (double *ptr= items_list; !__builtin_isnan (*ptr); ptr++)sum += *ptr;printf("total for items list: %g\n", sum);sum=0;double *next_set_list = (double []){-1, 2.2, 4.8, 0.1, (__builtin_nanf (""))}; int next_set_len = 0; for (next_set_len =0; !__builtin_isnan (next_set_list[next_set_len]); ) next_set_len ++;;for (int i=0; i < next_set_len; i++)sum += next_set_list[i];printf("total for next set list: %g\n", sum);
}

一招让你彻底掌握C语言中运用宏以及#与##的妙用相关推荐

  1. C语言使用define定义圆周率,C语言中的宏处理

    在C语言中使用宏,我们经常这么做,但是为什么使用宏,他可以做什么,我们或许只是一知半解,下面简单介绍如何在C语言中使用宏预处理器. #define语句 对于define语句,我们已经非常熟悉,一个宏定 ...

  2. c语言中关于宏和内联说法正确的是, 2011年1月高等教育自学考试全国统一命题考试 C++程序设计试题...

    版权声明:以上文章中所选用的图片及文字来源于网络以及用户投稿,由于未联系到知识产权人或未发现有关知识产权的登记,如有知识产权人并不愿意我们使用,如果有侵权请立即联系:55525090@qq.com,我 ...

  3. 关于C语言中的宏的一点点讨论

    前言: 熟悉C语言的朋友应该对宏不陌生, 宏在C语言程序开发中是经常使用的,使用其的主要目的是方便程序员的编程工作,并且能在一定程度上提高程序的效率.C语言中提供的宏定义命令是#define.下面就使 ...

  4. C语言怎么判断字符YN,c语言中的宏_详解(转)

    1. 简单宏定义 简单的宏定义有如下格式: [#define指令(简单的宏)] #define 标识符替换列表 替换列表是一系列的C语言记号,包括标识符.关键字.数.字符常量.字符串字面量.运算符和标 ...

  5. C语言中的宏函数与宏定义

    目录 1.无参宏定义 1.1 无参数宏定义的格式: 1.2 使用说明: 2.带参宏定义 2.1 带参数宏定义的格式: 2.2 使用说明: 3.带参宏定义与函数调用的区别 4.头文件中常用的宏定义 5. ...

  6. C语言中关于宏定义的学习

    1.C语言中宏定义的使用 2.GCC官方文档 3.C语言宏定义的几个坑和特殊用法 转载于:https://www.cnblogs.com/Brandon0807/p/11146344.html

  7. C语言中利用宏,实现一个整数的奇数位和偶数位交换,以及计算结构体中某变量相对于首地址的偏移

    C语言中的自定义宏 自定义宏,令其实现所需功能 1.写一个宏,可以将一个整数字的奇数位和偶数位交换. 2.写一个宏,计算结构体中某变量相对于首地址的偏移. 具体思路1: 首先取出当前数的奇数部分和偶数 ...

  8. 使用C语言中的宏来定位出错信息

    编写一个软件时,软件的健壮性时特别值得考虑的问题.使用C++时可以使用异常捕获机制,在设计完软件的模块架构的时候然后再设计异常捕获架构,一般来说需要设计一个异常捕获网来捕获程序中可能的异常. 对于异常 ...

  9. c语言宏函数怎么传递宏参数_C语言中的宏参数评估

    c语言宏函数怎么传递宏参数 We can define a function like Macro, in which we can pass the arguments. When a Macro ...

最新文章

  1. SDN第二次上机作业
  2. 10个免费在线逻辑关系图表图形设计制作工具
  3. KVM虚拟机添加虚拟磁盘
  4. VB.Net to C Sharp Converter有用吗?
  5. Dijkstra模板
  6. 两个等号(==)和三个等号(===)的区别
  7. 华为人工智能计算机平台,华为发布首个人工智能移动计算平台
  8. 损失函数_SRGAN损失函数(目标函数)详解
  9. 安徽工业大学计算机考研历年分数线,安徽工业大学历年考研分数线汇总[2012-2021]...
  10. Win7系统忘记登入密码的解决方法
  11. [PL/SQL]使用存储过程实现导出指定数据到文件(仿EXP)|转|
  12. Bootstrap学习(一)
  13. 2014/08/11 – Backbonejs
  14. 循环删除list中多个元素
  15. 8uftp是不是要保存,4步掌握8uftp保存密码的方法
  16. 2021 大学生电子设计竞赛 G题 无人机 识别部分
  17. 蚂蚁小程序--自学笔记
  18. 转载 SpringMVC详解(一)------入门实例
  19. V模型、W模型、H模型示意图以及优缺点对比
  20. Clickhouse 函数基础入门

热门文章

  1. sql查询复习笔记-小技巧,大智慧(续一)
  2. 全新ARM base PocketPC 2003 Emulator Beta 已登場。
  3. poj 1192(简单树形dp)
  4. NYOJ 625 笨蛋的难题(二)
  5. linux jdk 安装
  6. 查看Linux下网卡状态或 是否连接(转)
  7. The Joy of Clojure – Clojure philosophy(1)
  8. 通过 .htaccess 实现缓存策略
  9. Install oracle 10g on RHEL 5.6--quick reference
  10. asp.net学习资源汇总