`
happmaoo
  • 浏览: 4472834 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

C语言变参函数的两个实现

阅读更多

作者:朱金灿
来源:http://blog.csdn.net/clever101/


国庆假期看了《程序员的自我修养——链接、装载和库》的大部分,其中P337提到了C语言变长参数的一些实现原理,书上的一个例子是(我对书上的代码作了一些小改动,书上的例子编译有点小问题):



这里利用了函数的栈上的位置依次排列的原理(即不定参数的地址依次在变量num的高地址方向,同时函数调用约定采用的是cdecl)。下面是我参考MSDN实现和C语言的printf函数一样功能的MyPrintf函数:



上面两个函数的测试代码:



测试环境:Win XP + sp3, VS 2008 + sp1,unicode字符集。


参考文献:


1. 《程序员的自我修养--链接、装载和库》,俞甲子 / 石凡 / 潘爱民

2. MSDN(与VS 2008 + sp1配套)








分享到:
评论

相关推荐

    c语言变参函数--转载[定义].pdf

    C语言中的变参函数是一种特殊类型的函数,它们允许在函数调用时传递不同数量或类型的参数。这种功能在处理如`printf`这样的格式化输出函数时非常有用。`printf`函数的原型是`int printf(const char* format, ...)`,...

    C语言变参函数设计.doc-综合文档

    在C语言中,函数参数的个数和类型可以是可变的,这种特殊的函数被称为可变长参数函数(变参函数)。这种功能使得开发者能够编写更加灵活和强大的程序模块。 可变长参数函数的关键在于`stdarg.h`头文件,其中定义了...

    c语言实现的一个简单的日志函数

    2. `va_start`: 用于初始化`va_list`变量,它需要两个参数,一个是`va_list`变量,另一个是最后一个固定参数。例如:`va_start(args, last_fixed_arg);`这里的`last_fixed_arg`是紧跟在可变参数列表前的最后一个已知...

    C语言函数速查 C语言函数大全 C函数

    例如,`int add(int a, int b)`定义了一个名为`add`的函数,它接受两个整数参数`a`和`b`,并返回一个整数值。 2. 函数调用: 调用已定义的函数时,我们只需写上函数名后面跟着一对括号,括号内是传递给函数的实参...

    模拟printf和scanf可变参函数的实现

    在C/C++编程中,`printf`和`scanf`是两个非常重要的标准输入输出函数,它们可以处理可变数量的参数。理解并实现这样的可变参函数是深入学习C/C++语言的关键步骤之一。本文将详细讲解如何模拟`printf`和`scanf`的功能...

    使用变参函数实现STM32串口的简易printf功能(新)

    2. fmt和pnt的含义:在变参函数中,fmt和pnt是两个重要的变量,分别指向下一个需要处理的字符和变参。 3. 格式符的解析:在处理fmt字符串时,我们需要解析后面的格式符,例如%c、%s、%d等,并将相应的参数从变参列表...

    C语言程序设计函数与编译预处理PPT学习教案.pptx

    本教程将深入探讨C语言中的两个核心概念:函数和编译预处理。 一、函数 函数是C语言中组织代码的基本单元,它们允许我们将大问题分解为可重用的小部分。函数定义了完成特定任务的一组指令,可以在程序的任何地方...

    ARM中打印函数print 的几种实现方法

    首先,定义一个可变参数列表的类型va_list,然后定义两个宏,一个是用于开始变参函数的va_start,另一个是用于结束的va_end。为了正确地从参数列表中提取不同类型的数据,还需要定义两个宏va_arg来获取参数,以及va_...

    C语言中可变参数函数实现原理

    总结来说,C语言中可变参数函数的实现原理主要依靠函数调用栈的结构和`stdarg.h`头文件中的宏定义,通过这些工具,程序员可以灵活地处理数量不确定的参数列表,从而实现类似`printf`那样功能丰富的函数。

    C语言函数调用规定[文].pdf

    而cdecl则更灵活,适用于那些需要动态参数列表的函数,比如C语言中的变参函数`printf`。 理解函数调用约定对于编写跨平台或与特定编译器交互的代码至关重要。不同的编译器可能有不同的默认调用约定,或者提供自定义...

    关于C语言----七:函数

    `(int x, int y)`是参数列表,`x`和`y`是两个整型参数。 二、函数声明 函数声明告诉编译器函数的存在,但不包含函数体。声明通常在调用函数之前进行,以确保编译器知道函数的返回类型和参数。例如: ```c int add...

    C语言中常用的标准库函数.pdf

    8. 变参函数处理:提供了宏定义和类型,支持变参函数的实现。 9. 本地化函数:定义了与本地化相关的函数,比如setlocale用于设置或查询程序的本地化设置,这些设置影响了日期、时间和数值的格式。 10. 时间处理...

    C语言实训项目-查字典

    1. 变参函数:变参函数是指可以接受可变数量参数的函数。 2. 函数指针:函数指针是指指向函数的指针,可以用于回调函数和高阶函数。 3. 泛型算法:泛型算法是指可以应用于多种数据类型的算法。 4. 复杂链表的链表...

    《你必须知道的495个C语言问题》

    3.15 我要检查一个数是不是在另外两个数之间,为什么if(a b c)不行? 40 3.16 为什么如下的代码不对?int a=1000, b=1000; long int c=a * b; 40 3.17 为什么下面的代码总是给出0?double degC, degF; degC= ...

    C语言函数用法.rar-综合文档

    这声明了一个名为`add`的函数,它接受两个整数参数`a`和`b`,并返回一个整数。函数定义则包含实现这个加法操作的代码: ```c int add(int a, int b) { return a + b; } ``` 二、函数参数 函数可以有零个、一个或...

    你必须知道的495个C语言问题

    3.15 我要检查一个数是不是在另外两个数之间,为什么if(abc)不行? 3.16 为什么如下的代码不对?inta=1000,b=1000;longintc=a*b; 3.17 为什么下面的代码总是给出0?doubledegC,degF;degC=5.0/9*(degF-32); ...

    cdecl函数调用,了解printf这样的函数调用,对比stdcall会更清楚.zip

    例如,当调用一个接受两个整数参数的函数时,调用者会先将第二个参数压栈,然后是第一个参数,最后是函数地址。 以printf函数为例,它是一个变参函数,接受一个格式化字符串和其他可变数量的参数。尽管printf不遵循...

    C语言库函数

    以上只是C语言库函数的一部分,实际上,C标准库还包括更多的头文件和函数,如`locale.h`、`stdarg.h`、`wchar.h`等,它们为开发者提供了处理国际化、变参函数、宽字符等高级功能。理解和熟练使用C语言库函数是每个C...

Global site tag (gtag.js) - Google Analytics