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. CPU-内存-IO-网络调优

    一.关于CPU 中央处理器调优 1. CPU处理方式: 批处理,顺序处理请求.(切换次数少,吞吐量大) 分时处理.(如同"独占",吞吐量小)(时间片,把请求分为一个一个的时间片,一 ...

  2. A股委托类型

    上海交易所于2006年8月7日启用了两种类型的市价委托,分别为:“最优五档即时成交剩余撤销”.“最优五档即时成交剩余转限价”. 深圳证券交易所启用了“对手方最优价格委托”.“本方最优价格委托”.“最优 ...

  3. Java集合(4):未获支持的操作及UnsupportedOperationException

    执行各种添加和移除的方法在Collection中都是可选操作的,这意味着实现类并不需要为这些方法提供实现.当我们调用这些方法时,将不会执行有意义的行为,而是通常抛出UnsupportedOperati ...

  4. 【Struts中private static final long serialVersionUID的作用】

     private static final long serialVersionUID = -1672970955045193907L;   SerialVersionUID,后面简称SUID 其实序 ...

  5. vue是一个渐进式的框架,我是这么理解的

    vue是一个渐进式的框架,我是这么理解的 原文地址 时间:2017-10-26 10:37来源:未知 作者:admin 每个框架都不可避免会有自己的一些特点,从而会对使用者有一定的要求,这些要求就是主 ...

  6. 安装mysql-proxy

    1.下载安装包 wget https://cdn.mysql.com/archives/mysql-proxy/mysql-proxy-0.8.5-linux-glibc2.3-x86-64bit.t ...

  7. 【并行计算-CUDA开发】GPU 的硬体架构

    GPU 的硬体架构   这里我们会简单介绍,NVIDIA 目前支援CUDA 的GPU,其在执行CUDA 程式的部份(基本上就是其shader 单元)的架构.这里的资料是综合NVIDIA 所公布的资讯, ...

  8. 第三次Java实验报告

    Java实验报告 班级 计科二班 学号20188437 姓名 何磊 完成时间 2019/9/22 评分等级 实验三 String类的应用 实验目的 掌握类String类的使用: 学会使用JDK帮助文档 ...

  9. [bzoj1892][bzoj2384][bzoj1461][Ceoi2011]Match/字符串的匹配_KMP_树状数组

    2384: [Ceoi2011]Match 1892: Match 1461: 字符串的匹配 题目大意: 数据范围: 题解: 很巧妙的一道题呀. 需要对$KMP$算法有很深的理解才行. 首先我们需要发 ...

  10. Cannot call sendRedirect() after the response has been committed的解决办法

    做一个Login Demo的时候,写了如下代码: protected void doPost(HttpServletRequest request, HttpServletResponse respo ...