C's Macro Introduction

1.The Connect Macros: ##

这是一个预处理连接符,这个操作符主要用来将两个符号连接成为一个完整的宏符号。通过下面的代码,可以看到其具体的使用方法:

  1. 如下例子:
#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;
}
  1. 运行结果如下所示:

2.The Variadic Macros: ... and __VA_ARGS__

在某些函数当中,需要接收变化数量的参数,例如基本的printf函数。

我们可以通过将函数的最后一个参数定义为宏...,这样函数就可以使用预定义的宏__VA_ARGS__来表示变化数量的变量了。

  1. 如下例子:
#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__

  1. 基本概念:
  • FILE:宏在预编译时会替换成当前的源文件名.
  • LINE:宏在预编译时会替换成当前的行号.
  • FUNCTION:宏在预编译时会替换成当前的函数名称.
  • TIME:在源文件中插入当前编译时间.
  • DATE:在源文件中插入当前的编译日期.
  1. 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;
}
当程序在预编译过程当中,上述的三种宏就被替换成了对应的数值或者字符串了。
  1. 运行结果:

4.The FUNC Macro.

通常我们将某些简短的函数直接改写为宏定义,这就减少了我们在调用过程中的代码编写。

#define pi 3.14称作变量式宏定义,再如#define MAX(a,b) (a>b?a:b)称为函数时宏定义。具体例子如下:

  1. 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;
}
  1. Result:

5.Reference

宏定义中的操作符

C语言的宏macro的使用

C语言的宏macro的使用的更多相关文章

  1. [易学易懂系列|rustlang语言|零基础|快速入门|(22)|宏Macro]

    [易学易懂系列|rustlang语言|零基础|快速入门|(22)|宏Macro] 实用知识 宏Macro 我们今天来讲讲Rust中强大的宏Macro. Rust的宏macro是实现元编程的强大工具. ...

  2. scheme 宏macro写法

    scheme里的宏不同的实现有不同的写法: 1.mzscheme的define-macro (mzscheme也就是pltschme,也就是drracket,没有define-macro这个关键字) ...

  3. C语言中宏定义(#define)时do{}while(0)的价值(转)

    C语言中宏定义(#define)时do{}while(0)的价值 最近在新公司的代码中发现到处用到do{...}while(0),google了一下,发现Stack Overflow上早有很多讨论,总 ...

  4. c 语言中宏定义和定义全局变量的区别

    宏定义和定义全局变量的区别: 1 作用时间不同. 宏定义在编译期间即会使用并替换,而全局变量要到运行时才可以. 2 本质类型不同. 宏定义的只是一段字符,在编译的时候被替换到引用的位置.在运行中是没有 ...

  5. flask第30篇——宏macro和import标签

    宏是Jinja2特有的,像Django则没有这个. 先新建一个项目macroDemo: 然后在templates文件夹中新建index.html文件,并在代码中返回渲染后的文件: 然后回到index. ...

  6. 注解是建立在class文件基础上的东西,同C语言的宏有异曲同工的效果

    注解是建立在class文件基础上的东西,同C语言的宏有异曲同工的效果 https://www.cnblogs.com/deman/p/5519901.html @是java注解,即annotation ...

  7. Flask基础(15)-->模板代码的复用【宏(Macro)、继承(Block)、包含(include)】

    宏 对宏(macro)的理解: 把它看作 Jinja2 中的一个函数,它会返回一个模板或者 HTML 字符串 为了避免反复地编写同样的模板代码,出现代码冗余,可以把他们写成函数以进行重用 需要在多处重 ...

  8. C语言基础--宏

    宏在C语言中经常使用,在linux的源码中可以看到很多宏的高级应用.因此不理解宏,就很难理解代码.本文参考一些互联网资料做一些总结,希望给大家带来帮助. 先说说使用宏的优点及缺点: 优点: 1.提高代 ...

  9. C语言高级宏技巧

    特殊符号#.## (1)# When you put a # before an argument in a preprocessor  macro, the preprocessor turns t ...

随机推荐

  1. JAVA 基础编程练习题6 【程序 6 求最大公约数及最小公倍数】

    6 [程序 6 求最大公约数及最小公倍数] 题目:输入两个正整数 m 和 n,求其最大公约数和最小公倍数. 程序分析:利用辗除法. package cskaoyan; public class csk ...

  2. list中包含多个相同值时,List中的indexOf(Object o)方法的返回值

    查一下Java API,List下的indexOf(Object o)方法的返回值为list列表中首个元素出现位置的索引,找不到时返回-1

  3. [SOME_MUTATION] (state) {// mutate state}Vuex中使用 ES2015 风格的计算属性命名功能来使用一个常量作为函数名

    使用常量替代 Mutation 事件类型 使用常量替代 mutation 事件类型在各种 Flux 实现中是很常见的模式.这样可以使 linter 之类的工具发挥作用,同时把这些常量放在单独的文件中可 ...

  4. 深入理解C语言-结构体做函数参数

    结构体做函数参数,在C语言中属于常见现象,此时为了内存考虑,不传递结构体,而是传递结构体的地址 结构体定义 struct Man { char name[64]; int age; }; 结构体可以与 ...

  5. mac 查看占用的端口并关闭进程

    -i 查看某个端口是否被占用,如 lsof -i:8081 显示占用情况 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME java 12188 a ...

  6. day31 socket套接字编程

    为什么要有套接字编程? 在上节课的学习中,我们学习了OSI七层协议,但是如果每次进行编程时我们都需要一层一层的将各种协议使用在我们的程序中,这样编写程序实在是太麻烦了,所以为了让程序的编写更加的简单, ...

  7. CentOS学习之NTP服务配置详解

    详解centos7下ntp服务配置 一.ntp服务是什么 1.定义 NTP是网络时间协议(Network Time Protocol),它是用来同步网络中各个计算机的时间的协议. 2.发展 首次记载在 ...

  8. JavaScript引用类型简单记录

    Object Array instanceof Function 引用类型 - Object {} 等价于 new Object() 我们经常使⽤用对象来承载可选参数,⽽而⽤用 命名的形式参数来传递必 ...

  9. Hadoop_常用命令(hdfs上)

    Hadoop_常用命令(hdfs上) hadoop fs所有文件系统都可以使用 hdfs dfs仅针对于hdfs文件系统 - 1 - 查看所有目录(文件夹)及文件  hdfs dfs -ls / - ...

  10. spring-boot 使用jdk6(三)

    环境 jdk 6 tomcat 7.0.59 sts 4.4.2 maven 3.2.5 背景 由于环境限制,还在使用 JDK6,所以需要将 spring boot 进行配置,支持JDK6. 以下所有 ...