zoukankan      html  css  js  c++  java
  • C++ ## ... 实用

    关于...的使用

    ...在C宏中称为Variadic Macro,也就是变参宏。比如:

    #define myprintf(templt,...)fprintf(stderr,templt,__VA_ARGS__)


    // 或者


    #define myprintf(templt,args...) fprintf(stderr,templt,args)

    第一个宏中由于没有对变参起名,我们用默认的宏__VA_ARGS__来替代它。第二个宏中,我们显式地命名变参为args,那么我们在宏定义中就可以用args来代指变参了。同C语言的stdcall一样,变参必须作为参数表的最有一项出现。当上面的宏中我们只能提供第一个参数templt时,C标准要求我们必须写成:

    myprintf(templt,);

    的 形式。这时的替换过程为:

    myprintf("Error! ",);


    替换为:



    fprintf(stderr,"Error! ",);

    这是一个语法错误,不能正常编译。这个问题一般有 两个解决方法。首先,GNU CPP提供的解决方法允许上面的宏调用写成:

    myprintf(templt);

    而它将会 被通过替换变成:

    fprintf(stderr,"Error! ",);

    很明显,这里仍然会产生编译错误(非本例的 某些情况下不会产生编译错误)。除了这种方式外,c99和GNUCPP都支持下面的宏定义方式:

    #define myprintf(templt, ...) fprintf(stderr,templt,##__VAR_ARGS__)

    这 时,##这个连接符号充当的作用就是当__VAR_ARGS__为空的时候,消除前面的那个逗号。那么此时的翻译过程如下:

    myprintf(templt);


    被转化为:


    fprintf(stderr,templt);

    这样如果templt合法,将不会产生 编译错误。 这里列出了一些宏使用中容易出错的地方,以及合适的使用方式。

  • 相关阅读:
    python学习笔记 day14 各种推导式
    python学习笔记 day14 生成器表达式
    python学习笔记 day14 生成器进阶(二)
    python学习笔记 day14 生成器进阶
    python学习笔记 day13 迭代器
    python 学习笔记 day12 作业讲解--员工信息表
    PAT L3-020 至多删三个字符
    2019省赛训练组队赛3.26周二---FJUT 2016
    PAT L3-007 天梯地图
    POJ 2234 Matches Game
  • 原文地址:https://www.cnblogs.com/diegodu/p/6180736.html
Copyright © 2011-2022 走看看