C语言的宏macro的使用
C's Macro Introduction
1.The Connect Macros: ##
这是一个预处理连接符,这个操作符主要用来将两个符号连接成为一个完整的宏符号。通过下面的代码,可以看到其具体的使用方法:
- 如下例子:
 
#include <stdio.h>
struct macro
{
    int N;
    char M;
};
struct macro macro_drv = {100,20};
#define XNAME(n) x##n
#define Macro(x) x##_drv.N
int main(void)
{
    char *XNAME(3) = "Hello,Macro(##)\n";
    printf("%s",XNAME(3));
    printf("The struct:%d\n",Macro(macro));
    return 0;
}
- 运行结果如下所示:

 
2.The Variadic Macros: ... and __VA_ARGS__
在某些函数当中,需要接收变化数量的参数,例如基本的printf函数。
我们可以通过将函数的最后一个参数定义为宏...,这样函数就可以使用预定义的宏__VA_ARGS__来表示变化数量的变量了。
- 如下例子:
 
#include <stdio.h>
#define PR(x,...) printf("Message" #x ":" __VA_ARGS__)
#define VA(x,y,...) printf(#x" "#y" "#__VA_ARGS__)
int main(void)
{
    PR(1,"%s,%s\n","Hello","Macro");
    VA(I,am,Superman!);
    return 0;
}
上述程序中输入给PR函数的参数一共有4个:1,"%s,%s\n","Hello","Macro",第一个参数是保存在x形参中的,剩下的三个参数保存在__VA_ARGS__宏当中。
2. 运行结果如下所示:

3.The Other Macros:__FILE__ __LINE__ __FUNCTION__
- 基本概念:
 
- FILE:宏在预编译时会替换成当前的源文件名.
 - LINE:宏在预编译时会替换成当前的行号.
 - FUNCTION:宏在预编译时会替换成当前的函数名称.
 - TIME:在源文件中插入当前编译时间.
 - DATE:在源文件中插入当前的编译日期.
 
- Coding:
 
#include <stdio.h>
int main(void)
{
    printf("The Source File Name:%s\n",__FILE__);
    printf("Current Code Line:%d\n",__LINE__);
    printf("Current Func Name:%s\n",__FUNCTION__);
    return 0;
}
当程序在预编译过程当中,上述的三种宏就被替换成了对应的数值或者字符串了。
- 运行结果:

 
4.The FUNC Macro.
通常我们将某些简短的函数直接改写为宏定义,这就减少了我们在调用过程中的代码编写。
如#define pi 3.14称作变量式宏定义,再如#define MAX(a,b) (a>b?a:b)称为函数时宏定义。具体例子如下:
- Codeing:
 
#include <stdio.h>
#define E 4
#define PI 3.14
#undef E // 将定义完成的宏撤销,可以重新定义一个名字叫E的宏.
#define E 3
#define MAX(a,b) ((a)>(b)?(a):(b))
int main(void)
{
    printf("The PI:%f\n",PI);
    printf("The Bigger:%f\n",MAX(PI,2.34));
    return 0;
}
- Result:

 
5.Reference
C语言的宏macro的使用的更多相关文章
- [易学易懂系列|rustlang语言|零基础|快速入门|(22)|宏Macro]
		
[易学易懂系列|rustlang语言|零基础|快速入门|(22)|宏Macro] 实用知识 宏Macro 我们今天来讲讲Rust中强大的宏Macro. Rust的宏macro是实现元编程的强大工具. ...
 - scheme 宏macro写法
		
scheme里的宏不同的实现有不同的写法: 1.mzscheme的define-macro (mzscheme也就是pltschme,也就是drracket,没有define-macro这个关键字) ...
 - C语言中宏定义(#define)时do{}while(0)的价值(转)
		
C语言中宏定义(#define)时do{}while(0)的价值 最近在新公司的代码中发现到处用到do{...}while(0),google了一下,发现Stack Overflow上早有很多讨论,总 ...
 - c 语言中宏定义和定义全局变量的区别
		
宏定义和定义全局变量的区别: 1 作用时间不同. 宏定义在编译期间即会使用并替换,而全局变量要到运行时才可以. 2 本质类型不同. 宏定义的只是一段字符,在编译的时候被替换到引用的位置.在运行中是没有 ...
 - flask第30篇——宏macro和import标签
		
宏是Jinja2特有的,像Django则没有这个. 先新建一个项目macroDemo: 然后在templates文件夹中新建index.html文件,并在代码中返回渲染后的文件: 然后回到index. ...
 - 注解是建立在class文件基础上的东西,同C语言的宏有异曲同工的效果
		
注解是建立在class文件基础上的东西,同C语言的宏有异曲同工的效果 https://www.cnblogs.com/deman/p/5519901.html @是java注解,即annotation ...
 - Flask基础(15)-->模板代码的复用【宏(Macro)、继承(Block)、包含(include)】
		
宏 对宏(macro)的理解: 把它看作 Jinja2 中的一个函数,它会返回一个模板或者 HTML 字符串 为了避免反复地编写同样的模板代码,出现代码冗余,可以把他们写成函数以进行重用 需要在多处重 ...
 - C语言基础--宏
		
宏在C语言中经常使用,在linux的源码中可以看到很多宏的高级应用.因此不理解宏,就很难理解代码.本文参考一些互联网资料做一些总结,希望给大家带来帮助. 先说说使用宏的优点及缺点: 优点: 1.提高代 ...
 - C语言高级宏技巧
		
特殊符号#.## (1)# When you put a # before an argument in a preprocessor macro, the preprocessor turns t ...
 
随机推荐
- Swagger 介绍
			
简介Swagger 是最流行的 API 开发工具,它遵循 OpenAPI Specification(OpenAPI 规范,也简称 OAS).Swagger 可以贯穿于整个 API 生态,如 API ...
 - liunx基本操作命令
			
1. rm 删除命令 rm -i 文件名-----------询问y/N 删除文件 rm -f 文件名-----------直接删除文件 rm -r 目录 rm 文件名 rm ...
 - k8s集群证书过期(kubeadm 1.10.2 )
			
1.k8s 集群架构描述 kubeadm v1.10.2创建k8s集群. master节点高可用,三节点(10.18.60.3.10.18.60.4.10.18.60.5). LVS实现master三 ...
 - 【OpenCV】轮廓的特征矩Moment
			
opencv中的矩主要包括以下几种:空间矩,中心矩和中心归一化矩. class Moments { public: ...... // 空间矩 double m00, m10, m01, m20, m ...
 - IT架构的本质
			
老僧三十年前未参禅时,见山是山,见水是水. 及至后来,亲见知识,有个入出,见山不是山,见水不是水. 而今得个休歇处,依前见山只是山,见水只是水. 参禅的三重境界在IT技术圈同样适用,初学者感叹每个产品 ...
 - Prefix to Infix Conversion
			
Infix : An expression is called the Infix expression if the operator appears in between the operands ...
 - [转帖]PKI系统深入介绍
			
PKI系统深入介绍 https://blog.csdn.net/liuhuiyi/article/details/7776825 2012年07月23日 20:17:01 liuhuiyi 阅读数 4 ...
 - Spring系列三:IoC 与 DI
			
水晶帘动微风起,满架蔷薇一院香. 概述 在软件工程中,控制反转(IoC)是一种设计思想,对象之间耦合在一起,在运行时自动绑定,并且它们编译时对所需要引用的对象是不确定的.在这个spring教程中,通过 ...
 - P1616 疯狂的采药 (完全背包优化)
			
(点击此处查看原题) 题意 简单来说,就是一个完全背包,不过这里卡住了常规的完全背包写法,时间复杂度为O( V*∑( V/c[i] ))如下所示: ;i <= n ;i ++) { scanf( ...
 - 执行jar包,输出信息到文件
			
有时如果临时需要上项目执行一些脚本或者临时文件,可以将项目达成jar包,去执行 执行jar包: java -jar test.jar 输出日志到文件:nohup java -jar test.jar ...