省略符形参

在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

  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
引用\[1\]中提到,一个函数只能返回一个值,但有时候函数需要返回多个值,可以采用返回数组或vector的方式。如果返回的值数量较少,也可以使用引用形的方法。引用\[2\]给出了一个示例代码,展示了如何使用引用形返回结果。在这个示例中,函数find_char()返回查询字符串中特定字符的第一次索引位置,并通过额外的引用形occurs返回该特定字符出现的次数。在函数内部,通过修改occurs的值来记录出现次数。最后,在主函数中调用find_char()函数,并打印返回的索引位置和出现次数。 另外,引用\[3\]中还提到了另一种形式的函数数,即省略符形(...)。这种形式的数可以接受任意数量的数。但是需要注意的是,省略符形在使用时需要谨慎,因为它无法提供数的类型信息,可能会导致类型不匹配的问题。 综上所述,可以使用引用形或返回数组/向量的方式来实现函数的数返回结果。具体选择哪种方式取决于返回值的数量和类型。 #### 引用[.reference_title] - *1* *2* [C++ 使用引用形返回额外信息](https://blog.csdn.net/qq_43799400/article/details/124076791)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [C++ 函数的形初始化](https://blog.csdn.net/dongnanzhi_/article/details/127149954)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值