c语言如何实现不定参数,C语言中不定参数的实现

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

但是请注意,由於 K&R C 中并不检查参数型态,so 在此是用 ANSI

C 来说明,毕竟 ANSI C 是目前所有 C Compiler 都支援的标准;常在

网路上看到有人推荐 K&R The C Programming Language 这本书,老

实说这本是不错(我以前也是看这本),但因为 K&R C 慢慢因为 ANSI

C 的完整标准出现,而面临考验,所以我建议若是初学者先从 ANSI C

看起,等对 ANSI C 的标准了解後,再回头看这本(其实不看也没差,虽

然它号称 C 语言圣经,但时代在变,有些东东开始不适用。不过还是有

看的价值)

//

// 固定的参数一定要放前面!!

int FUNC(int xx,...)

{

int tmp;

va_list arg_ptr; // 用va_list声明指向引数列表的 Pointer

va_start(arg_ptr,xx); // 从引数表中取得第一个引数

// 第一个引数就是 xx 自己(xx是最后一个固定变量)

tmp=va_arg(arg_ptr,int); // 从引数表中取得int 型态引数

// 一直呼叫 va_arg 即可取得所

// 有引数(第二个参数int是当前不定变量的类型 )

va_end(arg_ptr); // 取完後将 arg_ptr = NULL

// 以便归还 stack 空间(要在所有的不定变量引用完之后再用va_end(),否则会有无法预测的结果。)

}

理论上不定参数是可以无限多的,但碍於 memory 及 stack 大小

所以项数通常有上限,如 Turbo C 最多 200 个,一超过就出现如下

" Fatal stack overflow error-System halted ",然後当掉,你连

暖开机都不行;所以当你使用一套 Compiler 时一定要有其参考手册

或资料,以免搞半天除错後,还找不出原因!!

(P.S. 像 Turbo C 2.0 只能用 4000 个 if ,....太多要注意的!!)

说了一堆,不知道你会用了没?! 最後用一个画多边型的函数做□

例,顺便做结束。

/* EX */

#include  // 记得要 include 才能用

#define END_P -400 // 用来判断是否为最後一个参数

void DrawPoly(int color,...)

{

va_list arg_ptr;

int x[200],y[200]; // 最多 200 个点

int p_c=0; // 计算有几点

int i; // 计数器

va_list(arg_ptr,color);

while(((x[p_c]=va_arg(arg_ptr,int))>END_P) \

&&((y[p_c]=va_arg(arg_ptr,int))>END_P)\

&& p_c<=200) // 不是最後一点且小於 200 个点

p_c++;

if(p_c<3) return ; // 不到 3 点不成一多边型,So 跳出

for(i=0;i

// 划线,每个 Compiler 不同,自行修改

line(x[i],y[i],x[i+1],y[i+1],color);

// 最後一条线

line(x[0],y[0],x[p_c-1],y[p_c-1],color);

va_end(arg_ptr);

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/360429.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SX-BOX试用笔记

1.今天开始试用SX-BOX&#xff0c;我将用它来做自己平时的开发和文档的工作&#xff0c;因为我的职责是一个程序员。 1.屏幕如果支持更大的也清晰的话&#xff0c;我会感觉很舒服。 2.USB设备插入还无法识别。。。 3.现在开始安装开发工具&#xff0c;目前我打算在上面安装Adob…

c语言成绩转换绩点,如何将平时成绩转化为GPA成绩?

新东方留学生资料下载姓名手机号短信验证码图片验证码年级请选择5年级6年级7年级8年级9年级高一高二高三高三复习大一大二大三大四大五研一研二研三博一博二在职课程请选择雅思托福GREGMATSAT其他行政区请选择请选择请选择{"name":{"label":"姓名&quo…

Hibernate查询缓存如何工作

介绍 既然我已经介绍了实体和集合缓存&#xff0c;现在该研究查询缓存的工作原理了。 查询缓存与实体严格相关&#xff0c;它在搜索条件和满足该特定查询过滤器的实体之间绘制关联。 像其他Hibernate功能一样&#xff0c;查询缓存也不像人们想象的那么琐碎。 实体模型 对于我…

Javascript学习笔记1 数论

1.Javascript不用担心内存的回收与对象的销毁&#xff01; 2.Javascript有&#xff1a;infinity、NaN全局变量表示 被0整除的无穷 和 非数字。undefined和null表示 未定义 和 空&#xff0c;undefined和null可以互换&#xff0c;判别二者需用 全等 号&#xff08;不光判断值&…

C语言bcd码减法过程,bcd码的减法运算规则举例.ppt

bcd码的减法运算规则举例第1章&#xff1a;微型计算机基础 本章基本要求&#xff1a; ⑴ 单片微型计算机的含义 ⑵ 各系列单片机的特点 ⑶ 51系列单片机的概念及指标(重点) ⑷ 单片微机工业产品概念 第1章&#xff1a;微型计算机基础 电子计算机是一种能对信息进行加工处理的机…

JavaFX技巧20:有很多需要展示的地方吗? 使用画布!

JavaFX应用程序似乎有两种&#xff1a;第一种使用带有节点和CSS样式的场景图&#xff0c;第二种使用单个画布。 但是&#xff0c;将这两种方法混合使用是完全合法的。 尤其是当您的应用程序必须显示大量详细信息时&#xff0c;您很容易最终创建成千上万个节点。 即使JavaFX的整…

VirtualBox命令更改虚拟硬盘空间

主要是使用VBoxManage命令来操作第一步&#xff1a;打开CMD&#xff0c;进入到virtualbox存放虚拟机的目录中(win7 系统可以直接在文件夹空白处按住shift键右键鼠标选择[在此处打开命令窗口])&#xff0c;输入[vboxmanage list hdds]可以查看所有的虚拟机的信息&#xff0c;这里…

华为手机老是android自动升级,华为手机系统怎么升级 华为手机升级系统的两种方法...

华为手机使用的均为安卓系统&#xff0c;升级方法有多种&#xff0c;各位可以根据条件不同自行选择升级。华为手机升级系统的两种方法方法一&#xff1a;手机联网更新首先把手机联网。点击设置。向下拖动点击最后一项“关于手机”点击“系统软件更新”。点击在线升级即可。友情…

Wildfly,Apache CXF和@SchemaValidation

在过去的几天中&#xff0c;我一直在进行从JBoss 4到Wildfly 8的应用程序迁移。 该应用程序使用了不同的技术&#xff0c;但是我们这里将重点放在XML Web Services JAX-WS上 。 是的&#xff0c;我知道它们已不再流行&#xff0c;但是这些是很久以前开发的&#xff0c;因此需要…

linux网络体系架构

原创kylin_zeng:http://blog.csdn.net/kylin_fire_zeng 本文参考国嵌视频教程&#xff0c;再此感谢国嵌教育。 一、协议栈层次对比&#xff1a; 1&#xff09;网络接口层把数据链路层和物理层合并在了一起&#xff0c;提供访问物理设备的驱动程序&#xff0c;对应的网络协议主…

android 自定义弹窗diss,Android中自定义PopupWindow,动态弹窗。

我的第一篇博客&#xff0c;咱们直奔主题。先上个效果图在android中自定义PopupWindow&#xff1a;1、首先定义好你想要显示的窗口的布局文件&#xff0c;再实例化一个View对象&#xff1a;窗口布局可灵活变化&#xff0c;dialog_layout.xml代码如下&#xff1a;android:id&quo…

拼图项目的动机和目标

几周前&#xff0c;我写了一篇关于Jigsaw项目如何破坏现有代码的文章 。 那么&#xff0c;我们能得到什么回报呢&#xff1f; 让我们看一下项目解决的痛点及其在Java 9中解决问题的目标。 系列 这篇文章是正在进行的有关拼图项目系列的一部分。 按照推荐的顺序&#xff08;不同…

android中按一个按钮弹出字,允许用户在Android中长按一次即可编辑按钮文字

我想允许App用户在Android中更改Button文本。 当用户单击按钮时&#xff0c;它应该执行某些操作&#xff0c;但是当他/她长按按钮时&#xff0c;将弹出一个编辑文本&#xff0c;并且无论用户键入什么内容都应另存为按钮文本。到目前为止&#xff0c;我已经完成了以下操作。btn1…

异常作弊– Java 8 Lambdas

异常作弊– Java 8 Lambdas 撇开关于Checked vs Runtime异常的宗教辩论&#xff0c;有时由于库的构造不佳&#xff0c;处理Checked示例会使您发疯。 考虑一下您可能要编写的以下代码片段&#xff1a; public void createTempFileForKey(String key) {Map<String, File>…

hdu 4738 桥

题目&#xff1a;还是自己看题目吧 trick&#xff1a;当不连通时不需要人去炸。否则&#xff0c;当桥的费用为0时当然需要一个人去炸。。。 #include <set> #include <map> #include <list> #include <cmath> #include <queue> #include <sta…

关于单元测试脚手架的几点思考

莱昂&#xff1a;Luc Besson的专业人士 当我开始通过创建相同的对象并准备数据来运行测试来重复使用单元测试方法时&#xff0c;我对设计感到失望。 带有大量代码重复的长时间测试方法看起来并不正确。 为了简化和缩短它们&#xff0c;基本上有两个选项&#xff0c;至少在Java…

android 使用c 代码实现,JNI开发实现helloworld,调用自己的C代码实现(1)

JNI开发&#xff0c;实现自己的C代码&#xff0c;helloworld在这里实现一个简单的demo,完成加载自己的C代码使用Android studio&#xff0c;一步一步教你实现在屏幕上显示出helloworld如下图显示&#xff0c;配置号NDK的路径&#xff0c;没有路径的需要自己下载&#xff0c;在A…

使用WSO2 ESB进行邮件内容过滤

每个集成架构师或开发人员都应该熟悉Gregor Hohpe和Bobby Woolf所描述的企业集成模式&#xff08;EIP&#xff09; 。 模式之一是“内容消息过滤器” &#xff08;不要与消息过滤器模式混淆&#xff09;。 使用不同的Mediator在WSO2中有多种方法可以实现此目的。 一种方法是使…

BZOJ 1045 [HAOI2008]糖果传递 ★(环形等分:中位数)

题意 有n个小朋友坐成一圈&#xff0c;每人有ai个糖果。每人只能给左右两人传递糖果。每人每次传递一个糖果代价为1。 思路 假设平均数是x&#xff0c;且a1给an了k个&#xff08;k<0说明是an给a1了-k个&#xff09;&#xff0c;那么总代价就可以算出来&#xff1a; ananka1-…

android壁纸应用,HPSTR - 可能是你见过最会玩的壁纸应用 - Android 应用 - 【最美应用】...

今天这款 HPSTR 壁纸应用也不例外&#xff0c;HPSTR 主要的壁纸素材源来自 Unsplash(ios/android)、500px(android)、Reddit(android)这些素材源的图片都很优秀&#xff0c;特别是 Unsplash 它是著名的无版权图片网站。它家主要以风景为主&#xff0c;数量也足够多&#xff0c;…