C语言 va_arg 宏

ChatGPT 3.5 国内中文镜像站免费使用啦

零基础 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简介

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_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
*/

四.猜你喜欢

  1. C语言 数组下标越界和内存溢出区别
  2. C语言 使用指针遍历数组
  3. C语言 指针和数组区别
  4. C语言 指针数组和数组指针区别
  5. C语言 野指针
  6. C语言 函数值传递和址传递
  7. C语言 函数不定长参数
  8. C语言 函数指针
  9. C语言 指针函数
  10. C语言 回调函数 callback
  11. C语言 #pragma once
  12. C语言 #include <> 与 #include “” 区别
  13. C语言 const 修饰函数参数
  14. C语言 const 和 define 区别
  15. C语言 #运算符
  16. C语言 ##运算符
  17. C语言 __VA_ARGS__
  18. C语言 ##__VA_ARGS__
  19. C语言 函数不定长参数 ##__VA_ARGS__经典案例
  20. C语言 va_start 宏
  21. C语言 va_end 宏
  22. C语言 va_arg 宏

ChatGPT 3.5 国内中文镜像站免费使用啦
© 版权声明
THE END
喜欢就支持一下吧
点赞1 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容