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 ...
随机推荐
- LAMP之Apache调优
一.环境的搭建 实验环境: 操作系统:Centos 7.4 [root@xuegod70 ~]# ls apr-1.6.3.tar.gz apr-util-1.6.1.tar.bz2 httpd-2. ...
- 用python实现简单EXCEL数据统计的实例
用python实现简单EXCEL数据统计的实例 下面小编就为大家带来一篇用python实现简单EXCEL数据统计的实例.小编觉得挺不错的,现在就分享给大家,也给大家做个参考.一起跟随小编过来看看吧 任 ...
- JAVA 基础编程练习题13 【程序 13 根据条件求数字】
13 [程序 13 根据条件求数字] 题目:一个整数,它加上 100 后是一个完全平方数,再加上 168 又是一个完全平方数,请问该数是多少? 程序分析:在 10 万以内判断,先将该数加上 100 后 ...
- 树莓派使用c语言控制管脚--wiringPi安装
树莓派先安装git,然后安装库 命令如下 git clone https://github.com/WiringPi/WiringPi cd wiringPi ./build 测试--输出管脚信息 g ...
- sql server 备份语句
1.BACKUP DATABASE your_database TO DISK = 'diff.bak'with DIFFERENTIAL #差异备份,仅备份数据2.BACKUP DATABASE y ...
- C# 关于App.config
App.config是winfrom等程序的应用程序配置文件,用来存放一些参数. app.config只会在应用程序启动时加载一次. 当程序在运行中修改app.config中的参数是不会生效,必须要重 ...
- Python Network Security Programming-1
UNIX口令破解1.程序运行需求: 其中dictionary.txt文件为破解口令的字典文件,passwords.txt文件为临时存放UNIX系统密码的文件 2.程序源码: import crypt ...
- AttributeError: module 'unittest' has no attribute 'TestCase'
一个自己给自己挖的坑 大家千万不要用库的名称命名,特别是刚刚入门的时候.文件夹.文件,都不要用库的名称. 一旦与库重名,就会出现这种 AttributeError. 引以为戒,以后我再这么命名,我就是 ...
- vue $refs获取dom元素
1.今天做vue项目有个获取dom节点,主要目的是获取节点让滚动到顶部 首先在滑动容器去添加ref <div class="contentScroll" ref=" ...
- day35 守护进程、互斥锁、IPC
day35 守护进程.互斥锁.IPC 1.守护进程 # 守护进程:当父进程执行完毕后,设置的守护进程也会跟着结束# 当一个进程被设置为守护进程后,其不能再产生子进程 from multiproces ...