C语言可变参数函数使用总结

发布者:chunying最新更新时间:2013-05-13 来源: 21IC关键字:C语言  可变参数函数  编译环境 手机看文章 扫描二维码
随时随地手机看文章

//ADS1.2下编译使用

void TestFun(char* fmt,...)

{

int ch;

char selch = 0;

va_list ap = NULL;

va_start(ap, fmt);

do

{

selch = *fmt;

if (selch!=\'%\')

{

putchar(*fmt);

}

else

{

selch = *++fmt;

switch(selch)

{

case \'c\':

ch = va_arg(ap, int);

printf("%c",ch);

break;

case \'d\':

ch = va_arg(ap,int);

printf("%d",ch);

break;

case \'x\':

ch = va_arg(ap, int);

printf("%#x",ch);

break;

}

}

++fmt;

}while(*fmt!=\'\');

va_end(ap);

}

//调用

TestFun((char*)"this is %d,%c,%x",1234,\'6\',0x12345);

//WIN-TC编译通过

#i nclude

/************************************************************

typedef void *va_list;

#define va_start(ap, parmN) (ap = ...)

#define va_arg(ap, type) (*((type *)(ap))++)

#define va_end(ap)

***************************************************/

void TestFun(cosnt char* fmt,...)

{

int ch;

long i32value = 0;

char selch = 0;

va_list ap = 0;

va_start(ap, fmt);[page]

do

{

selch = *fmt;

if (selch!=\'%\')

{

putch(*fmt);

}

else

{

selch = *++fmt;

switch(selch)

{

case \'c\':

ch = va_arg(ap, int);

printf("%c",ch);

break;

case \'d\':

ch = va_arg(ap,int);

printf("%d",ch);

break;

case \'x\':

ch = va_arg(ap, int);

printf("%#x",ch);

break;

case \'l\':

if(*++fmt== \'d\')

{

i32value = va_arg(ap, long);

printf("%ld",i32value);

}

else

{

putch(\'l\');

if(*fmt!=0)

{

putch(*fmt);

}

}

break;

default:

break;

}

}

++fmt;

}while(*fmt!=\'\');

va_end(ap);

}

void main(void)

{

TestFun("this is %d,%c,%x,%ld",1234,\'6\',0x2345,(long)12345678);

getch();

}

void main(void)

{

TestFun("this is %d,%c,%x,%ld",1234,(char)\'6\',0x2345,(long)12345678);

getch();

}

上述的example使用宏定义, var_start(ap, pareN),var_arg(ap,type),var_end(ap).

var_start(ap, pareN) //是ap指向第一个变参.

var_arg(ap,type),//返回变参的实际值.

var_end(ap).//是ap指向空指针.

具体的实现,在不同的编译环境下有所不同.

关键字:C语言  可变参数函数  编译环境 引用地址:C语言可变参数函数使用总结

上一篇:C语言中auto register static const volatile 区别
下一篇:单片机C语言编程心得

推荐阅读最新更新时间:2024-03-16 13:24

基于51单片机--C语言之预处理总结
编译预处理器是C语言编译器的一个重要组成部分。很好的利用C语言的预处理命令可以增强代码的可读性,灵活性,和易于修改等特点,便于程序的结构化。 预处理命令由符号“#”开头,包括宏定义,文件包含,条件处理三个部分。 其中条件编译我还没有用过,所以就详细介绍一下宏定义和文件包含。 一.宏定义 宏定义命令为#define,它的作用就是实现用一个简单易读的字符串来代替 另一个字符串。增加程序的可读性,和维护性。 宏定义分为不带参数的宏定义,和带参数的宏定义。 不带参的宏定义: 一般格式:#define 标识符 常量表达式 例如用一个字符代替一个常数 #define PI 3.1415926 当程序中出现3.1415926这个常数的时候就
[单片机]
PIC单片机C语言程序设计(12)
  6.Pic单片机C语言程序SIM软件仿真技巧(2)   鉴于C 语言模拟仿真(SIM)在学习C 语言程序时十分有用,这里笔者再进一步讨论模拟仿真的更多功能。   ⑴ 模拟仿真C 程序运行的全过程,如果想要仿真查看《PIC 单片机C 语言设计程序(8)》Pic07.C 中的程序的全部运行过程(0 ~ 99 的增量),是十分困难的,其原因是,主函数voidmain( ) 要调用显示函数display(x),而该显示函数为了完成X++ 的0 ~ 99 任意一个增量(△为1 秒)的显示,则要通过循环语句while(d 0)进行d-- 的100 次循环(因d=100),模拟仿真这种循环太费时。且在该循环语句while(d 0)中, 又
[单片机]
PIC单片机<font color='red'>C语言</font>程序设计(12)
实数FFT算法的设计及其C语言实现
  目前国内有关数字信号处理的教材在讲解快速傅里叶变换(FFT)时,都是以复数FFT为重点,实数FFT算法都是一笔带过,书中给出的具体实现程序多为BASIC或FORTRAN程序并且多数不能真正运行。鉴于目前在许多嵌入式系统中要用到FFT运算,如以DSP为核心的交流采样系统、频谱分析、相关分析等。本人结合自己的实际开发经验,研究了实数的FFT算法并给出具体的C语言函数,读者可以直接应用于自己的系统中。   首先分析实数FFT算法的推导过程,然后给出一种具体实现FFT算法的C语言程序,可以直接应用于需要FFT运算的单片机或DSP等嵌入式系统中。   1 倒位序算法分析   按时间抽取(DIT)的FFT算法通常将原始数据倒位序存储
[单片机]
实数FFT算法的设计及其<font color='red'>C语言</font>实现
PIC单片机入门_C语言编程技术
1.为什么也是C语言? 用C 语言来开发单片机系统软件最大的好处是编写代码效率高、软件调试直观、维护升级方便、代码的重复利用率高等,因此C 语言编程在单片机系统设计中越来越广泛的运用。PIC 单片机的软件开发,同样可以用C 语言实现。 Microchip 公司没有自行开发PIC单片机的C 语言编译器,但其他公司有开发众多支持PIC 单片机的C 语言编译器,常见的有Hitech、CCS、IAR、Bytecraft 等公司。其中最常用的是Hitech 公司的PICC 编译器,它稳定可靠,编译生成的代码效率高,在用PIC 单片机开发者中得到广泛认可。 Hitech-PICC 编译器基本上符合ANSI C标准,但是不支持函数的递归调用
[单片机]
51单片机C语言学习笔记3: 存储器结构
MCS-51单片机在物理结构上有四个存储空间: 1、片内程序存储器 2、片外程序存储器 3、片内数据存储器 4、片外数据存储器 但在逻辑上,即从用户的角度上,8051单片机有三个存储空间: 1、片内外统一编址的64K的程序存储器地址空间(MOVC) 2、256B的片内数据存储器的地址空间(MOV) 3、以及64K片外数据存储器的地址空间(MOVX) 在访问三个不同的逻辑空间时,应采用不同形式的指令(具体我们在后面的指令系统学习时将会讲解),以产生不同的存储器空间的选通信号。 程序内存ROM 寻址范围:0000H ~ FFFFH 容量64KB EA = 1,寻址内部ROM;EA = 0,寻址外部ROM 地址长度:
[单片机]
文字转声明: 编写程序将特定格式的输入转换为C语言声明
一. 程序功能 编写程序将特定格式的输入转换为C语言声明. 二. 程序源码 #include stdio.h #include string.h #include ctype.h #define MAXTOKEN 100 enum {NAME, PARENS, BRACKETS}; int tokentype; char token ; char name ; char datatype ; char out ; int p_getch(void); void p_ungetch(int); int main(void) { int type, lasttype;
[单片机]
C语言中volatile关键字的使用
  volatile的意思是易变的、可变的,作用是限制编译器优化某些变量。首先看一段C51程序:   Keil在优化级别是为8时得到如下汇编代码(部分未列出):   可以看到,变量d的值赋给x,y,z时,只有x中是直接读取的d中数值,而y=d,z=d则直接将寄存器中的数值赋给y,z。若在此过程中,变量d的值被改变(比如d是一个硬件寄存器),则y,z变量中得到的数据将是错误的,因此在某些应用中程序存在隐患。      这类问题并不是编译器的问题。由于访问内部寄存器比访问RAM速度块,因此编译器在编译类似程序时,会对程序进行优化,除第一次编译变量所在在连续读取一个变量时,编译器为了简化程序,只要有可能就会把第一次读取的值
[单片机]
<font color='red'>C语言</font>中volatile关键字的使用
STM32学习第四课:STM32 c语言学习基础4
1.结构体的参数传递 在进行传值的时候,用结构体封装有利于函数的传递。 用指向结构体变量的指针作为函数参数。 结构体做函数参数有三种传递方式: 一:是传递结构体变量,这是值传递 二:是传递结构体指针,这是地址传递 三:是传递结构体成员,当然这也分为值传递和地址传递。 以传引用调用方式传递结构比用传值方式传递结构效率高。以传值方式传递结构需要对整个结构做一份拷贝。 下面看一个列子,student结构体中包含该学生的各种信息,我们在change函数中对其进行部分修改,再在主函数中输出其结果 1.下面传递结构体变量 #include stdio.h #include string.h #define format %dn
[单片机]
STM32学习第四课:STM32 <font color='red'>c语言</font>学习基础4
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved