ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

(C/C++ 学习) 41. C 语言可变长参数

2022-06-12 16:37:39  阅读:200  来源: 互联网

标签:va 函数 fmt C++ 41 char ap 参数 可变


前言:本文记录自己学习 C 语言可变长参数的设计原理,供自己以后复习,读者基本知识自行百度(涉及到参数压栈的相关知识)。C 语言提供了几个宏函数为实现变长参数提供了接口。

1. 头文件 : #include <stdarg.h>

2. 宏函数(右边注释部分为宏函数的模拟实现) :

Example :              //  void myPrintf(char* arg1, ...);

va_list ap; // char *ap; va_start(ap,arg1); // ap = (char *)&arg1 + sizeof(arg1); va_arg(ap, T); // *(T*) [ (ap = ap + sizeof(T)) - sizeof(T) ]; va_end(ap); // ap = (char *)0;

注意 1: 在 C 语言中为了实现一个变长参数的函数,必须要提供函数的第一个参数,用于获取该函数中整个参数栈的起始地址。上述宏函数中 arg1 即为可变长参数函数的第一个参数。

注意 2:va_arg(ap, T) 用于从参数列表中获取一个类型为 T 的参数,这个操作会更新 ap 指针,因此,va_arg() 只能按顺序获取变长参数函数的每一个参数。

注意 3:根据 C 标准,对于不确定参数的函数,传入参数会默认进行自动参数类型提升, 例如:传入 char 会被转成 int,float 会被转成 double,因此 va_arg(ap, char) 这种写法是不对的,因为可变长参数函数根本不会有 char 类型的参数。对于这部分,自行去查资料了解具体的提升规则。

3. 利用变长参数设计模拟实现 printf() 函数部分功能 :

void my_printf(const char* fmt, ... ) {
    va_list ap;
    va_start(ap,fmt);
    for (; *fmt; ++fmt) {
        if (*fmt != '%') {                                     // 普通字符原样输出
            putchar(*fmt);
            continue;
        }
        fmt++;switch (*fmt) {
            case '%': putchar('%'); break;                      // 输出 % 
            case 'd': cout << va_arg(ap, int);   break;         // 输出 整型变量
            case 'c': putchar(va_arg(ap, int));  break;         // 输出 字符
            case 's': cout << va_arg(ap, char*); break;         // 输出 字符串
        }
    }
    va_end(ap);
}

标签:va,函数,fmt,C++,41,char,ap,参数,可变
来源: https://www.cnblogs.com/tuihou/p/16368196.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有