C/C++参数中的三个点

在C语言编程过程中,常规函数的形式参数数量固定,调用时需提供与形式参数一一对应的实参。然而,有时我们希望函数能根据需求接受不同数量的参数,如常见的printf()scanf()函数以及系统调用execl()等。这类函数如何实现呢?C编译器通过一系列宏(如va_startva_argva_end)来支持这一特性,这些宏有助于跨平台编程,增强代码的可移植性。

宏的使用

宏的两种形式

  • ANSI标准形式:至少包含一个普通形式参数,之后跟随省略号...作为函数原型的一部分。

    type funcname(type para1, type para2, ...)
    
  • UNIX System V兼容形式:无需普通形式参数,使用va_alistva_dcl宏定义。

    type funcname(va_alist)
    va_dcl
    

其中,va_dcl是对va_alist的进一步声明,依平台而异,但都以分号结束,因此在声明后不再添加分号。推荐使用符合ANSI标准的<stdarg.h>头文件,因为它具有更好的跨平台兼容性,而<varargs.h>主要用于保持与旧代码的兼容。

宏功能简介

  • va_start(argp, last_fixed_arg):初始化argp指针,使其指向第一个可变参数。
  • va_arg(argp, type):返回参数列表中的当前参数,并将argp移动到下一个参数位置。
  • va_end(argp):清理argp指针,通常设置为NULL

调用者需以特定方式指示可变参数的数量,如以特定值(如空字符串、-1)结束参数列表,或像printf()那样通过第一个参数来确定参数个数。

示例代码

ANSI标准形式示例

#include <stdio.h>
#include <stdarg.h>

// 原型声明,至少一个固定参数后跟...
int demo(char *msg, ...);

int main(void) {
    demo("DEMO", "This", "is", "a", "demo!", "\0");
    return 0;
}

// 函数定义
int demo(char *msg, ...) {
    va_list argp;
    int argno = 0;
    char *para;

    va_start(argp, msg);
    while (1) {
        para = va_arg(argp, char *);
        if (!strcmp(para, "\0")) break;
        printf("Parameter #%d is: %s\n", argno, para);
        argno++;
    }
    va_end(argp);
    return 0;
}

UNIX System V兼容形式示例

#include <stdio.h>
#include <varargs.h>

// 注意:此示例在不同平台上可能需要调整,如去除va_list或修改声明方式
int demo(va_alist);
va_dcl

int main(void) {
    demo("This", "is", "a", "demo!", "\0");
    return 0;
}

int demo(va_alist) va_dcl {
    va_list argp;
    int argno = 0;
    char *para;

    va_start(argp);
    while (1) {
        para = va_arg(argp, char *);
        if (!strcmp(para, "\0")) break;
        printf("Parameter #%d is: %s\n", argno, para);
        argno++;
    }
    va_end(argp);
    return 0;
}

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

橘色的喵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值