C/C++ va_end宏

最后更新于:2020-11-07 21:57:27

一.前言

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_startva_argva_end等,一般三者需要配套使用。

#include <stdarg.h>

#define va_start __crt_va_start
#define va_arg   __crt_va_arg
#define va_end   __crt_va_end

二.va_end简介

va_end函数声明如下:

#include <stdarg.h>//必须包含头文件

/*
*   清空参数列表, 并置参数指针arg_ptr无效.
*/
va_end(arg_ptr)

三.va_end使用

va_startva_end一般需要配套使用,示例如下:

/*
/************************************************************************/
/*@文件名      : va_start/va_end.cpp                                                       
/*@日  期      : 2020/10/14 21:52
/*@作  者      : 猿说编程 
/*@公众号      : 猿说编程
/*@博客        : www.shuopython.com
/*@描述        : C语言教程 - va_start/va_end宏
/************************************************************************/

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

void myPtintf(char *format, ...)
{
    va_list args;

    va_start(args, format);
    vprintf(format, args);
    va_end(args);
}

int main()
{
    myPtintf("hello world\n");
    myPtintf("%s\n", "hello world");
    myPtintf("%s %s\n", "hello world", "C语言教程-猿说编程");
    myPtintf("%d\n", 3);
    myPtintf("%d %d\n", 3, 6);
    myPtintf("%d %d %d \n", 1, 2, 3);

    printf("");

    return(0);
}


输出:
hello world
hello world
hello world C语言教程-猿说编程
3
3 6
1 2 3
*/

注意:在自定义printf函数myPtintf中,我们使用的是vprintf函数而非printf函数,注意vprintf函数和printf函数区别;


1. 三目运算符

2. 逗号表达式

3. char和wchar_t相互转换

4. wprintf输出中文乱码

5. unicode和多字节区别

6. Debug和_DEBUG区别

7. Debug和Release区别

8. _WIN32/WIN32/_WIN64/WIN64区别

9. memcpy/strcpy/strcpy_s区别

10. NaN(Not a Number)

11. INF:infinite)



转载请注明: 猿说编程 »C/C++教程 »va_end宏

赞赏

微信赞赏支付宝赞赏