zoukankan      html  css  js  c++  java
  • 宏技巧解读

    选自如下:http://wangcong.org/blog/archives/1821
    情况是这样的:在 Linux 内核中,有一个函数 kmap_atomic(),它之前带两个参数,而现在,它的第二个参数已经名存实亡了,可以直接去掉。所以问题就出来了,如何警告使用 kmap_atomic() 的人带有两个参数的形式是过时的?换句话说,怎么才能在用两个参数调用 kmap_atomic() 时发出警告而用一个参数调用时就没有警告?

    选用的技巧
    https://lkml.org/lkml/2011/11/27/3

    +
    +#define PASTE(a, b) a ## b //预处理运算符# #为宏扩展提供了一种连接实际变元的手段
    +#define PASTE2(a, b) PASTE(a, b)
    +
    +#define NARG_(_2, _1, n, ...) n //这里就是返回第三个参数的值,即是个数
    +#define NARG(...) NARG_(__VA_ARGS__, 2, 1, :) //这里的处理很巧妙,如果参数是一个,就返回第三个1,如果参数是两个,就返回第三个2.处理巧妙
    +
    +static inline void *kmap_atomic(struct page *page)
    +{
    + return __kmap_atomic(page);
    +}
    +
    +static inline void __deprecated *kmap_atomic_deprecated(struct page *page,
    + enum km_type km)
    +{
    + return __kmap_atomic(page);
    +}
    +
    +#define kmap_atomic1(...) kmap_atomic(__VA_ARGS__)
    +#define kmap_atomic2(...) kmap_atomic_deprecated(__VA_ARGS__)
    +#define kmap_atomic(...) PASTE2(kmap_atomic, NARG(__VA_ARGS__)(__VA_ARGS__)) //这里处理也很巧,通过##相连,即如果传入1个参数,那么就是NARG返回1,就是kmap_atomic1(__VA_ARGS__),出入两个参数,就是kmap_atomic2(__VA_ARGS__),非常巧妙

    另外

    关注<<C语言编程艺术>>,<<C prime plus>>这两本基础书

    对于可变参数部分及其反汇编探究,这里详细描述了

    http://www.rainsts.net/article.asp?id=902
    http://blog.csdn.net/linyt/article/details/2243605

  • 相关阅读:
    Scrapy 概览笔记
    Python 依赖版本控制 (requirements.txt 文件生成和使用)
    Python 虚拟空间的使用
    macOS 所有版本 JDK 安装指南 (with Homebrew)
    鉴权那些事
    Java 位运算符和 int 类型的实现
    ASP.NET Core 入门教程 5、ASP.NET Core MVC 视图传值入门
    如何做好一次知识或技术分享
    ASP.NET Core 入门教程 4、ASP.NET Core MVC控制器入门
    ASP.NET Core 入门教程 3、ASP.NET Core MVC路由入门
  • 原文地址:https://www.cnblogs.com/moonflow/p/2284080.html
Copyright © 2011-2022 走看看