社区
C++ 语言
帖子详情
急!如何实现类似int func(int a,int b,...)这种参数任意的函数的实现
mikewolf_x
2003-10-16 01:29:01
急!如何实现类似int func(int a,int b,...)这种参数任意的函数的实现.
我如何去引用那些参数?
...全文
74
9
打赏
收藏
急!如何实现类似int func(int a,int b,...)这种参数任意的函数的实现
急!如何实现类似int func(int a,int b,...)这种参数任意的函数的实现. 我如何去引用那些参数?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
9 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
sevencat
2003-10-17
打赏
举报
回复
这样好像不如直接调用vsprintf了
doyd
2003-10-17
打赏
举报
回复
告诉你一个很实用的方法,调试MFC,其中,可调试CString::Format(....)或者TRACE(...);
sevencat
2003-10-17
打赏
举报
回复
va_end
va_start好像都是宏。
cnxiaohai
2003-10-16
打赏
举报
回复
zoohoo(zoohoo)
说的太对了
的却
int func(int a,int b,...)
用起来很方便
缺点就是不能宏传递
sevencat
2003-10-16
打赏
举报
回复
这种函数用起来很方便 ,
就有一个缺点。
不能通过宏传递。
上次我问人的没有解决后来觉得这是编译器问题了。
made_in_
2003-10-16
打赏
举报
回复
楼上说的很全面了。
zoohoo
2003-10-16
打赏
举报
回复
采用C语言编程的时候,函数中形式参数的数目通常是确定的,在调用时要依次给出与形式参数对应
的所有实际参数。但在某些情况下希望函数的参数个数可以根据需要确定。典型的例子有大家熟悉的函数
printf()、scanf()和系统调用execl()等。那么它们是怎样实现的呢?
C编译器通常提供了一系列处理这种情况的宏,以屏蔽不同的硬件平台造成的差异,增加程序的可移
植性。这些宏包括va—start、va—arg和va—end等。
使用这些宏有两种不同的形式,二者在程序中包括的头文件不同,宏的定义也存在一些差别。这两种
方式对应的头文件和宏的声明见表1。
采用ANSI标准形式时,参数个数可变的函数的原型声明是:
type funcname(type para1, type para2, ...)
这种形式至少需要一个普通的形式参数,后面的省略号不表示省略,而是函数原型的一部分,type是
函数返回值和形式参数的类型。
采用与UNIX System V兼容的声明方式时,参数个数可变的函数原型是:
type funcname(va—alist)
va—dcl
这种形式不需要提供任何普通的形式参数,type是函数返回值的类型。va—dcl是对函数原型声明中参
数va—alist的详细声明,实际是一个宏定义,对不同的硬件平台采用不同的类型来定义,但在最后都包括
了一个分号,因此va—dcl后不再需要加上分号了。va—dcl在代码中必须原样给出,va—alist在VC中可以
原样给出,也可以略去,但在UNIX上的CC或Linux上的GCC中都要省略掉。此外,采用头文件stdarg.h编写的
程序是符合ANSI标准的,可以在各种操作系统和硬件上运行,而采用头文件varargs.h的方式仅仅是为了与
以前的程序兼容。所以建议大家使用前者。两种方式的基本原理是一致的,只是在语法形式上有一些细微的
区别。以下主要就前一种方式对参数的处理做出说明。
va—start使argp指向第一个可选参数。va—arg返回参数列表中的当前参数并使argp指向参数列表中的
下一个参数。va—end把argp指针清为NULL。函数体内可以多次遍历这些参数,但是都必须以va—start开始,
并以va—end结尾。
调用者在实际调用参数个数可变的函数时,要通过一定的方法指明实际参数的个数,例如把最后一个参
数置为空字符串(系统调用execl()就是这样的)、-1或其他的方式。
下面给出一个具体的例子,前一部分是采用了符合ANSI标准形式的代码,后一部分是采用了与UNIX System V
兼容方式的代码。代码中加了一些注释,这里就不再解释了。该例子已经在VC/Windows NT4.0、CC/AIX4.3.2.0、
GCC/Redhat Linux 6.0环境下编译并正常运行。
1.演示如何使用参数个数可变的函数,采用ANSI标准形式
#include 〈stdio.h〉
#include 〈string.h〉
#include 〈stdarg.h〉
/ 函数原型声明,至少需要一个确定的参数,注意括号内的省略号 /
int demo( char , ... );
void main( void )
{
demo(″DEMO″, ″This″, ″is″, ″a″, ″demo!″, ″\0″);
}
/ ANSI标准形式的声明方式,括号内的省略号表示可选参数 /
int demo( char msg, ... )
{
va—list argp;
/ 定义保存函数参数的结构 /
int argno = 0; / 纪录参数个数 /
char para;
/ 存放取出的字符串参数 /
/ argp指向传入的第一个可选参数,msg是最后一个确定的参数 /
va—start( argp, msg );
while (1) {
para = va—arg( argp, char );
/ 取出当前的参数,类型为char . /
if ( strcmp( para, ″\0″) == 0 )
/ 采用空串指示参数输入结束 /
break;
printf(″Parameter #%d is: %s\n″, argno, para);
argno++;
}
va_end( argp );
/ 将argp置为NULL /
return 0;
}
2.演示如何使用参数个数可变的函数,采用与UNIX System V兼容的方式
#include 〈stdio.h〉
#include 〈string.h〉
#include 〈varargs.h〉
/ 函数原型声明,括号内的类型va—list在VC/Windows NT4.0可以保留,但在AIX和Linux下需要
去掉,即改成int demo( ) /
int demo( va—list );
void main( void )
{
demo(″This″, ″is″, ″a″, ″demo!″, ″\0″);
}
/ UNIX System V采用的声明方式,括号内是va—alist,不是va—list,而且va—dcl后面不需
要分号 /
int demo( va—alist )
va—dcl
{
va—list argp;
/ 定义保存函数参数的结构 /
int argno = 0; / 纪录参数个数 /
char para;
/ 存放取出的字符串参数 /
va—start( argp );
/ argp指向第一个可选参数 /
while (1) {
para = va—arg( argp, char );
/ 取出当前的参数,类型为char /
if ( strcmp( para, ″\0″) == 0 )
/ 采用空串指示参数输入结束 /
break;
printf(″Parameter #%d is: %s\n″, argno, para);
argno++;
}
va_end( argp ); / 将argp置为NULL /
return 0;
}
zgrpmc
2003-10-16
打赏
举报
回复
用如下函数访问这些参数,
void va_end( va_list arg_ptr );
void va_start( va_list arg_ptr ); (UNIX version)
void va_start( va_list arg_ptr, prev_param ); (ANSI version)
具体作法可以参考MSDN资料,以及VC中CString::Format的代码
zhumerchant
2003-10-16
打赏
举报
回复
查查MSDN中的var_list, var_end等相关内容
区块链之实战VM虚拟机开发
若允许在合约A中直接修改合约B的状态数据,则这次修改是并未生成相关日志的,使得状态修改无法追溯,与区块链“可追溯”的特性相违背。 以太坊中跨合约调用也是没有保留日志的。笔者认为这是因为以太坊合约是不可...
C++可变
参数
函数
( 如:void
Func
(
int
a,
int
b, ...) )用法
该
函数
的用法涉及到一组宏,分别为va_list、va_start、va_arg、va_end,具体运用我还是直接用代码例子来讲解吧。 例子: 假设利用可变
参数
函数
通过传不限个数整数类型
参数
进行和运算: #include #include // 加了这个头文件就无需再加va_list、va_start、va_arg、va_end宏所在的头文件了 using namespace std;
c++学习 :
函数
形参4种传递形式:(
int
a)(
int
&a)(
int
*a)(
int
*& a)
c++学习 :
函数
形参4种传递形式1.void
func
(
int
para)2.void
func
(
int
& para)3.void
func
(
int
* po
int
er)4.void
func
(
int
* & po
int
er) 1.void
func
(
int
para) 定义一个
函数
,这个
函数
想改变a的值(只是个想法)。 void
func
(
int
para){ para =4; cout<<"para地址:"<<¶<<endl; }
C++之
函数
(
函数
参数
)
C++之
函数
(
函数
参数
)一 .
函数
的默认
参数
二 .
函数
重载1 .
函数
重载的注意事项三 .
函数
的占位
参数
一 .
函数
的默认
参数
在C++中,
函数
的形参列表中的形参是可以有默认值的。 语法:返回值类型
函数
名 (
参数
= 默认值){...} #include <iostream> using namespace std; //1. 如果某个位置
参数
有默认值,那么从这个位置往后,从左向右,必须都要有默认值
int
func
(
int
a,
int
b = 10,
int
c = 10) {
Golang 基础知识(九.
func
函数
)
文章目录1.定义2.可变
参数
3.多个返回值4.返回值命名5.作用域6.
函数
类型与变量7.
函数
类型变量8.
函数
作为
参数
9.
函数
作为返回值10.匿名
函数
11.闭包12.defer 语句(主要用于是释放资源:文件关闭、数据库连接关闭等等)13.panic/recover14.内置
函数
1.定义 Go语言中定义
函数
使用
func
关键字,具体格式如下:
func
函数
名(
参数
)(返回值){
函数
体 } 其中:
函数
名:由字母、数字、下划线组成。但
函数
名的第一个字母不能是数字。在同一个包内,
函数
名也称不能重名
C++ 语言
64,282
社区成员
250,470
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章