c /c++变参函数(转)
原文转自 https://blog.csdn.net/wwzcx/article/details/8940092
实现c/c++语言的变参函数。
变参函数 :void fun(para,...)
变参函数必须要有一个固定参数。
在头文件stdarg.h中定义了三个宏可以用到:
void va_start(va_list arg, prev_param );
type va_arg(va_list arg, type );
void va_end(va_list arg );
va在这里是variable-argument(可变参数)的意思.
那么变参函数的实现就变得相对简单很多。
一般的变参函数处理过程:
①定义一个va_list变量设为va
②调用va_start()使得va存放变参函数的变参前的一个固定参数的地址。
③不断调用va_arg()使得va指向下一个变参。
④最后调用va_end()表示变参处理完成。
原理就是:函数的参数在内存中从低地址向高地址依次存放。
看一个例子:模仿pritnf的实现:
#include<iostream>
#include<stdarg.h>
#include<string.h>
using namespace std; void func(char *c,...){ int i=;
double result=;
va_list arg; //va_list变量
va_start(arg,c); //arg指向固定参数c
while(c[i]!='\0'){ if(c[i]=='%'&&c[i+]=='d'){
printf("%d",va_arg(arg,int));
i++;
}
else if(c[i]=='%'&&c[i+]=='f'){
printf("%f",va_arg(arg,double));
i++;
}
else {
char newc[] = {c[i]}; //将字符转换为字符串输出,也可以用putchar()
printf("%s",newc);
}
i++;
}
va_end(arg);
} int main(){
int i=;
double j=100.0;
printf("%d be equal %f\n",i,j);
func("%d be equal %f\n",i,j); }
c /c++变参函数(转)的更多相关文章
- C++ 可变参函数实现
先简单总结一下基本的用法: void sum(int n, ...) { va_list arg_ptr = NULL; //申请一个指针 va_start(arg_ptr, n); //设置指针指向 ...
- C/C++中的可变参函数
可变参函数最好的实例:printf();参数可变 包含的头文件: C语言中:#include<stdarg.h> C++中的可变参的头文件:#include<cstdarg>, ...
- C语言变参函数/Variadic fucntion
几个重要的 宏/类型 定义 Macros Defined in header <stdarg.h> va_start enables access to variadic function ...
- Objective-C实现变参函数
原文:http://www.tanhao.me/pieces/1104.html NSLog(NSString *format, ...) + (id)arrayWithObjects:(id ...
- C 语言精髓之变参函数
我们以 printf 这个 very 熟悉的函数为例,来分析一下变参函数.先看下 printf 函数的定义: int printf(const char *fmt, ...) { int i; int ...
- java基础---->java中变参函数的使用
Java的变参函数实现实际上参数是一个数组,今天我们就简单的学习一下它的用法. java中的变参函数 一.它的使用方法如下: public class VariableParam { private ...
- 嵌入式C语言自我修养 08:变参函数的格式检查
8.1 属性声明:format GNU 通过 __atttribute__ 扩展的 format 属性,用来指定变参函数的参数格式检查. 它的使用方法如下: __attribute__(( forma ...
- va_start、va_arg、va_end、va_copy 可变参函数
1.应用与原理 在C语言中,有时我们无法给出一个函数参数的列表,比如: int printf(const char *format, ...); int fprintf(FILE *s ...
- Golang教程:函数、变参函数
函数是完成一个特定任务的代码块.一个函数接受输入,对输入进行一些运算并产生输出. 函数声明 在 Go 中声明一个函数的语法为: func functionname(parametername type ...
- C语言变参函数的实现原理
1. 变参函数简单示例 #include <stdarg.h> #include <stdio.h> int Accumlate(int nr, ...) { ; ; va_l ...
随机推荐
- realloc函数的用法
realloc(void *__ptr, size_t __size):更改已经配置的内存空间,即更改由malloc()函数分配的内存空间的大小. 如果将分配的内存减少,realloc仅仅是改变索引的 ...
- [Bzoj2286]消耗战(虚树+DP)
Description 题目链接 Solution 在虚树上跑DP即可 Code #include <cstdio> #include <algorithm> #include ...
- maston总结
Substitution Tags(替换标签) % ; # this is embedded Perl You have <% $cd_count %> CDs. Escaping sub ...
- Git-改变历史
悔棋 在日常的Git操作中,会经常出现这样的状况,输入git commit命令刚刚敲下回车键就后悔了:可能是提交说明中出现了错别字,或者有文件忘记提交,或者有的修改不应该提交,诸如此类. Git提供了 ...
- stm32--free modbus 1.5.0移植(作为从机)
添加文件 获取原始free modbus library(官网) 将...\freemodbus-v1.5.0\demo\BARE中的所有文件复制到...\freemodbus-v1.5.0\modb ...
- python的判断与循环
一.python的特殊缩进与语法 对于Python而言代码缩进是一种语法,Python没有像其他语言一样采用{}或者begin...end分隔代码块,而是采用代码缩进和冒号来区分代码之间的层次.缩进的 ...
- 10.bootstrap分页,点击哪个分页号,哪个分页号就active
1.分页,点击哪个分页号,哪个分页号就active <nav> <ul class="pagination"> <li><a href=& ...
- LC.exe已退出,代码为-1
解决方法就是把Properties文件下的license.licx给删除,重新编译,这样就可以了.
- 利用socket.io构建一个聊天室
利用socket.io来构建一个聊天室,输入自己的id和消息,所有的访问用户都可以看到,类似于群聊. socket.io 这里只用来做一个简单的聊天室,官网也有例子,很容易就做出来了.其实主要用的东西 ...
- 社区版pycharm安装Django框架
1.cmd下执行:pip3 install django 2.cmd下执行:django-admin startproject Demo (Demo为项目名称,可以更改你取的项目名称) 3.cmd下执 ...