目录
零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C 语言基础入门
对 printf
函数的使用,我们并不陌生,首先我们来看看下面关于 printf
函数的几种调用方式:
printf("hello world");
printf("%s","hello world");
printf("%s %s","hello world","C语言教程-猿说编程");
printf("%d",3);
printf("%d %d",3,6);
printf("%d %d %d ",1,2,3);
那么 printf
函数的原理到底是什么?
由于在 C
语言中没有函数重载,解决不定数目函数参数问题变得比较麻烦,即使采用 `C++,如果参数个数不能确定,也很难采用函数重载。对这种情况,提出了指针参数来解决问题。
C
编译器通常提供了一系列处理这种情况的宏,以屏蔽不同的硬件平台造成的差异,增加程序的可移植性。这些宏包括 va_start
、va_arg
、va_end
等,一般三者需要配套使用。
#include <stdarg.h>
#define va_start __crt_va_start
#define va_arg __crt_va_arg
#define va_end __crt_va_end
va_arg
函数声明如下:
#include <stdarg.h>//必须包含头文件
/*
* 返回参数列表中指针arg_ptr所指的参数, 返回类型为type.
* 并使指针arg_ptr指向参数列表中下一个参数.
* 返回的是可选参数, 不包括固定参数.
*/
va_arg(arg_ptr, type)
例如有如下函数声明:
void va_test(char a, char b, char c, …)
va_test
是一个不定长参数的函数,则它的固定参数依次是 a
, b
, c
,而 va_arg
返回值的是不固定参数,这样就可以达到遍历所有参数的目的;
va_start
、va_arg
、va_end
一般需要配套使用,示例如下:
/******************************************************************************************/
//@Author:猿说编程
//@Blog(个人博客地址): www.codersrc.com
//@File:C语言教程 - C语言 va_arg 宏
//@Time:2021/07/10 08:00
//@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
/******************************************************************************************/
#include "stdafx.h"
#include <stdio.h>
#include <stdarg.h>
//c参数类型,参数个数不确定。
//自定义方法
int Sum(int Num, ...)
{
int S = 0, T;
va_list ap;
va_start(ap, Num);
for (int i = 0; i<Num; ++i)
{
T = va_arg(ap, int); S += T;
}
return S;
}
void myPrintf(int Num, ...)
{
va_list ap;
va_start(ap, Num);
for (int i = 0; i<Num; i++)
{
//va_arg 返回值是不固定参数,所以第一个值是"dsdsdss"并非2
char *T = va_arg(ap, char*);
printf("myPrintf:%s\n", T);
}
}
int main()
{
int n;
myPrintf(2, "dsdsdss", "sdaddd");
printf("%d\n", Sum(10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10));
return 0;
}
输出:
myPrintf:dsdsdss
myPrintf:sdaddd
55
*/
未经允许不得转载:猿说编程 ? C 语言 va_arg 宏
本文由博客 - 猿说编程 猿说编程 发布!
原文:https://www.cnblogs.com/shuopython/p/15307283.html