zoukankan      html  css  js  c++  java
  • 省略符形参

    在c++  primer书上看到标题为“含有可变形参的函数”的章节,内容如下: 


    省略符形参有下列两种形式: 

    void foo ( parm_list , ...); 
    void foo ( ... ); 

    第一种形式为特定数目的形参提供了声明。在这种情况下,当函数被调用时,对于与显示声明的形参相对应的实参进行类型检查,而对于与省略符对应的实参则暂停类型检查。在第一钟形式中,形参声明后面的逗号是可选的。

    答:

    你可以传递任意数量的参数给他,所以当然跟没有参数的函数有区别了(没有参数的函数,你是不可以给他传递任何参数的)。 
    楼主提醒一点:省略号的优先级别最低,所以在函数解析时,只有当其它所有的函数都无法调用时,编译器才会考虑调用省略号函数的。 

    #include <stdio.h> 

    #include <stdarg.h> 


    void ArgFunc(const char *str, ... 

    va_list ap; 

    int n = 3; 

    char *s = NULL; 

    int d = 0; 

    double f = 0.0; 

    va_start(ap, str); // 注意!这里第二个参数是本函数的第一个形参 

    s = va_arg(ap, char*); 

    d = va_arg(ap, int); 

    f = va_arg(ap, double); // 浮点最好用double类型,而不要用float类型;否则数据会有问题 

    va_end(ap); 


    printf("%s is %s %d, %f", str, s, d, f); 



    void main() 

    ArgFunc("The answer", "Hello", 345, 788.234); 


    对于void ArgFunc(const char *str, ...): 

    首先,如果要处理不定参数的函数要包含头文件:#include <stdarg.h> 
    然后在处理不定参数的函数中先定义一个参数列表变量:va_list ap; 

    第二步:确定不定参数所在的位置。在这里,第一个参数为str,因此要从第二个参数进行获取参数列表。va_start(ap, str);表示在str参数之后获取参数。由于C调用是从右到左依次将参数压入堆栈的,因此处理起来比较容易。 

    第三步:获取参数并指明类型,如:va_arg(ap, char*);获取第一个参数,并指明类型为char* 
    在main()函数中就对应着实参"hello";va_arg(ap, int);紧接着再取一个参数,并指明类型为int,对应main()函数中的实参345;va_arg(ap, double);再接着取第三个参数,并指明类型为double,对应main()中的实参788.234

  • 相关阅读:
    2.12 使用@DataProvider
    2.11 webdriver中使用 FileUtils ()
    Xcode8 添加PCH文件
    The app icon set "AppIcon" has an unassigned child告警
    Launch Image
    iOS App图标和启动画面尺寸
    iPhone屏幕尺寸、分辨率及适配
    Xcode下载失败 使用已购项目页面再试一次
    could not find developer disk image
    NSDate与 NSString 、long long类型的相互转化
  • 原文地址:https://www.cnblogs.com/zahxz/p/2854171.html
Copyright © 2011-2022 走看看