(文章来源:嵌入式时代)

使用C++开发过程序时,定义函数可以指定默认参数,例如 void fun(int x, int y=3); 在调用 fun() 时第二个参数可以不传递,此时 fun() 函数默认第二个参数等于 3,例如 f(1) 就相当于 f(1,3)。这是一个很好用的特性,那么在C语言程序开发中,是否也可以定义带“默认参数”的函数呢?

首先应该清楚,目前C语言还没有原生支持带默认参数的函数,也就是说下面这样的C语言代码是非法的:void fun(int x, int y =3){return x+y;}fun(1); // 不等价于 fun(1, 3)。

但是,C语言作为一门极其灵活的编程语言,又的确可以借助其他基本语法实现这样的需求。不过要在C语言中定义带“默认参数”的函数可能略微有些繁琐,当然了,方法可能不止一种,本文不打算从枯燥的理论层面讨论这些方法,而是给出一个实例,希望能够起到抛砖引玉的作用。

假设我们希望在某段C语言程序中定义一个带默认参数的函数,它可以接收两个参数,并将之打印出来:double f(int i, double x){printf("i=%d, x=%0.2f\n", i, x);return x;}。现在期望调用 f 时,如果不显式指定参数,f 的两个默认参数为 (i=8, x=3.14),例如:f(); // 输出 i=3, x=3.14f(1); // 输出 i=1, x=3.14f(2, 6.28); // 输出 i=2,x=6.28。

C语言自然没有支持这种需求的原生语法,但是为了实现这样的目的,可以定义下面这个结构体,请看相关C语言代码:typedef struct {i;double x; f_args。接着,定义 f_base() 函数,它的C语言代码实现和 f() 是一样的,目的是让 f_base() 函数具有期望的 f() 函数功能。

显然,从上述C语言代码来看,var_f() 函数实现了默认参数的功能。现在再定义一个带可变参数的宏,这样一来,调用者就不必知道结构体 f_args 的结构了:#define f(...) var_f((f_args){__VA_ARGS__})。上述C语言代码在 main() 函数中调用 f() 函数,并分别传递了不同的参数,编译并执行之,得到如下结果:# gcc t.c# ./a.outi=3, x=8.00i=1, x=2.30i=2, x=3.14i=8, x=9.20。

可见,C语言是一门极其简洁灵活的编程语言,其他编程语言中一些好用的特性,可能C语言没有原生语法支持,但是我们却可以组合其他基本语法,自己实现这些好用的特性。不过应该注意,有件事是行不通的——f(0),因为上述实现我们无法在 var_f() 中区分 “0”究竟是调用者传递的,还是默认值,不过我相信聪明的读者应该能够想到解决这样的问题的方法。

c语言带默认参数吗,嵌入式C语言可以带“默认参数”的函数吗相关推荐

  1. c语言支持默认参数吗,嵌入式C语言可以带“默认参数”的函数吗

    描述 (文章来源:嵌入式时代) 使用C++开发过程序时,定义函数可以指定默认参数,例如 void fun(int x, int y=3); 在调用 fun() 时第二个参数可以不传递,此时 fun() ...

  2. 嵌入式c语言为什么变量定义在前面,嵌入式C语言数据类型和变量详解

    原标题:嵌入式C语言数据类型和变量详解 一般来讲,标准的C语言类型在嵌入式编译器中是合法的.但由于嵌入式控制器的受限环境.嵌入式c语言的变量和数据类型具有新的特征,这些特征体现在如下方面. 嵌入式C语 ...

  3. c语言程序设计教程博客,嵌入式C语言教程以及C编程要素

    计算机嵌入式行业逐渐成为就业者的新宠儿,而作为一个嵌入式C编程技术人员,熟练使用C语言是非常重要的,下面尚观教育小编就来跟大家聊一聊嵌入式C语言教程以及C编程要素. 嵌入式C语言教程以及C编程要素: ...

  4. c语言专业面试,10道嵌入式C语言经典面试题

    10道嵌入式C语言经典面试题 1.分析下面的C代码,它的运行结果可能是: #include int main(void) { int i = 0; if (i = 1) printf("i ...

  5. 嵌入式c语言学习笔记

    一.嵌入式 嵌入式即嵌入式系统,IEEE(美国电气和电子工程师协会)对其定义是用于控制.监视或者辅助操作机器和设备的装置,是一种专用的计算机系统:国内普遍认同的嵌入式系统定义是以应用为中心,以计算机技 ...

  6. linux c与c语言的区别吗,嵌入式c语言与c语言的区别

    原标题:嵌入式c语言与c语言的区别 最广泛使用的系统编程语言是C语言,它是使用自由格式源代码的简单编程语言:它曾用于以前用汇编语言构建的应用程序中.嵌入式C是C语言的扩展,它在嵌入式系统中应用于编写嵌 ...

  7. 知名外企嵌入式C语言笔试试题

    知名外企嵌入式C语言笔试试题 嵌入式C语言笔试试题 知名外企嵌入式C语言笔试试题 一. 选择题 二. 填空题 三.写出程序的运行结果 一. 选择题 01.C语言合法的常量是() A-45 B.078 ...

  8. 【嵌入式】C语言高级编程-嵌入式C语言简介(01)

    00. 目录 文章目录 00. 目录 01. C 语言标准 02. C 标准内容 03. C 标准的发展历程 04. 编译器对 C 标准的支持 05. 编译器对 C 标准的扩展 06. Linux内核 ...

  9. 干货:嵌入式C语言源代码优化方案(非编译器优化)

    点击上方"大鱼机器人",选择"置顶/星标公众号" 福利干货,第一时间送达! 1.选择合适的算法和数据结构 选择一种合适的数据结构很重要,如果在一堆随机存放的数中 ...

最新文章

  1. python中函数的作用域_Python中的函数作用域
  2. AutoCAD WS API发布【转】
  3. 计算机操作日志文件,查看电脑操作记录(LastActivityView)
  4. 来首都初次就医的感受
  5. java中如何判断aabb_java判断改错题
  6. 学习:SQL Server的BUILTIN\Administrators用户
  7. 开关电源电压型与电流型控制
  8. Verilog 层次化文件设计——彩灯控制器
  9. Windows防火墙的配置与应用
  10. oracle判断日期为月末,ORACLE查询月初和月底时间
  11. WindowsMessage
  12. 数学建模国赛美赛(MCM/ICM)赛前准备及比赛过程节奏分享
  13. 7-1 ATM机类结构设计(二) (100 分)
  14. 化繁为简,这家企业如何撬动千亿美元物联网服务大市场
  15. psv型号版本怎么看的
  16. Thymeleaf全解
  17. Django + Pytest搭建在线自动化测试平台
  18. 如何获得cnvd原创漏洞证书之信息泄露篇(结尾福利)
  19. 二 需求工程和设计模式
  20. 奔弛定理与三角形的五星

热门文章

  1. 有初学的同学问你为什么Java的main方法必须是public static void?请告诉ta!
  2. SparkShell中提交任务java.net.ConnectException: Call From henu4/192.168.248.244 to henu2:9000 failed on co
  3. 400+节点的 Elasticsearch 集群运维
  4. SpringBoot 注解大全
  5. Libra教程之:Libra协议的关键概念
  6. c++堆栈溢出怎么解决_c语言进阶:堆栈原理揭秘
  7. lombok常用注解整理
  8. Java Fork/Join 框架
  9. 使用Introspector(Java内省机制)实现Map转换为JavaBean
  10. MySql 中 case when then else end 的用法