zoukankan      html  css  js  c++  java
  • 可变参数省略号使用简介

    可变参数省略号使用简介

      C允许定义形参个数和类型不确定的函数。例如,C语言中的标准函数printf便使用这种机制。在声明不确定形参的函数时,形参部分可以使用省略号“…”代替。“…”告诉编译器,在函数调用时不检查形参类型是否与实参类型相同,也不检查参数个数。

      如:

    [root@centos-64-min exercise]# vi chang.c
    #include <stdio.h>
    int mult(int x , int y , const char * fmt , ...)
    {
    int result = x * y;
    if(fmt)
    {
    printf("%s:" , fmt);
    }
    return result;
    }

    编译器只检查第一个参数,第二个参数是否为整数,检查第三个参数是否是字符串,对后面的无论是什么参数,有多少个参数全部归入省略号处理,一律不管。

    [root@centos-64-min exercise]# vi chang.c
    #include <stdio.h>
    int mult(int x , int y , const char * fmt , ...)
    {
    int result = x * y;
    if(fmt)
    {
    printf("%s" , fmt);
    }
    return result;
    }
    int main(void)
    {
    int s = 0;
    s = mult(1 , 2 , "1*2=");
    printf("%d " , s);

    s = mult(2 , 3 , "2*3=" , "hahaha" , 12345 , 66666);        //完全忽视后面的参数“hahaha”、12345和66666
    printf("%d " , s);
    return 0;
    }

    "chang.c" 20L, 314C written
    [root@centos-64-min exercise]# gcc -o chang chang.c
    [root@centos-64-min exercise]# ./chang
    1*2=2
    2*3=6


    可变参数在宏定义的使用

    例子:

    [root@centos-64-min exercise]# vi chang.c
    s = rectangle_area(3 , 4 , "this rectangle's area is ");
    #include <stdio.h>
    int mult(int x , int y , const char * fmt , ...)
    {
    int result = x * y;
    if(fmt)
    {
    printf("%s" , fmt);
    }
    return result;
    }

    #define rectangle_area(x , y , args...) mult(x , y , ##args)
    #define square_area(x , args...) rectangle_area(x , x , ##args)
    #define myprintf(args...) square_area(1 , ##args)

    int main(void)
    {
    int s = 0;
    s = rectangle_area(3 , 4 , "this rectangle's area is ");
    printf("%d " , s);

    s = rectangle_area(3 , 4 , "this rectangle's area is " , 1 , "hahaha");
    printf("%d " , s);

    s = square_area(3 , "this square's area is ");
    printf("%d " , s);

    s = square_area(3 , "this square's area is " , "66666" , "hahaha" , 12345);
    printf("%d " , s);

    myprintf("6666666666666666666666666 ");
    myprintf("hahahahahahahahahaha " , "66666666666666" , 12345);
    return 0;
    }
    ~
    ~
    ~
    ~
    "chang.c" 34L, 819C written
    [root@centos-64-min exercise]# gcc -o chang chang.c
    [root@centos-64-min exercise]# ./chang
    this rectangle's area is 12
    this rectangle's area is 12
    this square's area is 9
    this square's area is 9
    6666666666666666666666666
    hahahahahahahahahaha

    简单解析:

    myprintf("hahahahahahahahahaha " , "66666666666666" , 12345);

    相当于:

    square_area(1 ,  "hahahahahahahahahaha " , "66666666666666" , 12345);

    相当于:

    rectangle_area(1 , 1 ,"hahahahahahahahahaha " , "66666666666666" , 12345);

    相当于:

    mult(1 , 1 ,"hahahahahahahahahaha " , "66666666666666" , 12345);

    mult只读取了mult(1 , 1 ,"hahahahahahahahahaha ");

    在这里:各层define定义的##args的值都传递给args...,最顶层的##args <=> const char * fmt , ...     所以最终mult只读取了args的第一个字符串的变量,后面的都是...处理了

  • 相关阅读:
    JDK的命令详解
    聊天室java socket
    怎么实现利用Java搜索引擎收集网址的程序
    Hibernate实现对多个表进行关联查询
    如何学好J2ME?
    谈谈Java工程师应该具有的知识
    【经营智慧】005.眼光盯着未来
    【成功智慧】002.对任何小事都不要掉以轻心
    【经营智慧】008.要想赚钱,就得打破既有的成见
    【思维智慧】004.砸碎障碍的石头,把它当做钥匙
  • 原文地址:https://www.cnblogs.com/King-Penguin/p/5199587.html
Copyright © 2011-2022 走看看