from http://blog.csdn.net/pipisorry/article/details/25437893

C语言中没有參数默认值的概念,能够利用宏来模拟參数默认值:

(对于有多个參数的函数,调用时须要将參数列表中的每一个 " , "写出来,只是这样就能够把默认參数放在非默认參数之前)

下面代码在c下是不能通过的:

定义fun():

int fun(int a, int b = 10)                         ...                   ...

{                                             ....     ...           ...     ....

return a+b;

}                                                    ..                  ..

主函数代码:                                           ....        ....

int main()                                                   ......

{

printf("%d\n",fun(10));

return 0;

}

..............................................................

编译时 fun(10) 调用会出错。注意这个代码在C++并不会错。

..............................................................

用宏改进后代码:

#include <stdio.h>

#define funi(a) fun( a, 10)

int fun(int a,int b )

{

        return a+b;

}

int main()

{

        int a = 10;

        printf("%d  %d\n",fun(a,10),funi(a));

        return 0;

}

结果: 20 20

  1. #include <stdio.h>
  2. #define DEFARG(name, defval) ((#name[0]) ? (name + 0) : defval)
  3. int _f1(int i)
  4. {
  5. return 2*i;
  6. }
  7. #define f1(arg0) _f1(DEFARG(arg0, 0))
  8. int _f2(int i, int j)
  9. {
  10. return i + j;
  11. }
  12. #define f2(arg0, arg1) _f2(DEFARG(arg0, 0), DEFARG(arg1, 1))
  13. int main()
  14. {
  15. printf("%d\n", f1());
  16. printf("%d\n", f1(1));
  17. printf("%d\n", f2(,));
  18. printf("%d\n", f2(2,));
  19. printf("%d\n", f2(, 3));
  20. printf("%d\n", f2(4, 5));
  21. return 0;
  22. }

#include <stdio.h>
#define DEFAULT 40 /*默认參数值*/
#define FUN(A) fun(#A##"-") /*用于实现默认參数的宏*/ int f(int n) /*用于实验默认參数的函数*/
{
return printf("%d\n",n);
}
int fun(const char *a) /*确定函数调用的函数,返回值类型要和实际须要调用的f()函数返回值类型一致*/
{
int n; /*变量的类型要和f()函数參数的类型一样*/
if (a[0]=='-') n=DEFAULT;
else sscanf(a,"%d",&n); return f(n); }
int main(void)
{
FUN();
FUN(67);
return 0;
}

ps:
假设是有头文件的话:
getStr.h
#define getStr() _getStr( "TestFun.txt" );//set default filename in .c

void _getStr(char filename[]);
getStr.c
void _getStr(char filename[]){
...
}
main.c
#include "getStr.h"
void main(){
getStr();
}



ref: 

http://blog.csdn.net/broook/article/details/7208408
http://nonoob.is-programmer.com/posts/36769.html
http://www.myexception.cn/c/232391.html
http://wenku.baidu.com/view/1ffed5d86f1aff00bed51eea.html
http://blog.csdn.net/broook/article/details/7208408

from http://blog.csdn.net/pipisorry/article/details/25437893

C语言默认參数值的实现的更多相关文章

  1. C语言可变參函数的实现

    1 C语言中函数调用的原理 函数是大多数编程语言都实现的编程要素.调用函数的实现原理就是:运行跳转+參数传递.对于运行跳转,全部的CPU都直接提供跳转指令:对于參数传递,CPU会提供多种方式.最常见的 ...

  2. Effective C++ Item 37 绝不又一次定义继承而来的缺省參数值

    本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie 经验:绝对不要又一次而来的缺省參数值.由于缺省參数值都是静态绑定,而 virtual 函数 ...

  3. C语言可变參实现參数累加返回

    C语言可变參的作用真的是很大,自从发表了可变參怎样实现printf.fprintf,sprintf的文章以来.便有不少博友私信问我实现的机制,我也解释了相关的知识点.今天,我们借着这个机会,再来举一个 ...

  4. Effective C++:条款37:绝不又一次定义继承而来的缺省參数值

    因为又一次定义继承而来的non-virtual函数是不对的(见上一个条款),所以这个条款就将问题局限于:绝不又一次定义继承一个带有缺省參数值的virtual函数. (一) virtual函数是动态绑定 ...

  5. javascript实现函数的默认參数值方法

    近期在学python,得益于python中的decorator思路,想到在javascript中參数是不能定义默认值的,可是能够通过decorator给它模拟出来,话不多说,上代码 <!DO ...

  6. effective C++中条款37:绝不又一次定义继承而来的缺省參数值

    virtual 函数会动态绑定,而virtual函数的缺省參数值是静态绑定的. 用一个base类型的指针p去指向一个derived类对象.通过p调用虚函数时,会动态绑定到实际所指对象中的函数:用一个d ...

  7. C语言函数參数传递原理

    C语言中參数的传递方式一般存在两种方式:一种是通过栈的形式传递.还有一种是通过寄存器的方式传递的. 这次.我们仅仅是具体描写叙述一下第一种參数传递方式,第二种方式在这里不做具体介绍. 首先,我们看一下 ...

  8. [Python] partial改变方法默认參数

    Python 标准库中 functools库中有非常多对方法非常有有操作的封装,partial Objects就是当中之中的一个,他是对方法參数默认值的改动. 以下就看下简单的应用測试. #!/usr ...

  9. [debug]重定义默认參数

    编敲代码过程中遇到重定义默认參数的错误,例如以下例所看到的: #include<iostream> #include<stdlib.h> using namespace std ...

随机推荐

  1. linux命令——scp 两台linux机器间文件或目录传输

    不同的Linux之间copy文件常用有3种方法: 第一种:ftp,也就是其中一台Linux安装ftpServer,这样可以另外一台使用ftp的client程序来进行文件的copy. 第二种:采用sam ...

  2. 一个【wchar_t】引发的学案

    今天在查cout  wcout区别的时候,看到一篇博客(http://blog.csdn.net/hikaliv/article/details/4570956) 里面讲到了wchar_t ----- ...

  3. PHP:产生不重复随机数的方法

    来源:http://www.ido321.com/1217.html 无论是Web应用,还是WAP或者移动应用,随机数都有其用武之地.在最近接触的几个小项目中,我也经常需要和随机数或者随机数组打交道, ...

  4. Codeforces Round #365 (Div. 2) C - Chris and Road 二分找切点

    // Codeforces Round #365 (Div. 2) // C - Chris and Road 二分找切点 // 题意:给你一个凸边行,凸边行有个初始的速度往左走,人有最大速度,可以停 ...

  5. JAVA中的数据结构——集合类(线性表:Vector、Stack、LinkedList、set接口;键值对:Hashtable、Map接口<HashMap类、TreeMap类>)

    Java的集合可以分为两种,第一种是以数组为代表的线性表,基类是Collection:第二种是以Hashtable为代表的键值对. ... 线性表,基类是Collection: 数组类: person ...

  6. Android自定义TTF字体

    前言: 在Android Design中一个设计手册.在设计手册中有常用的UI图标,图标大小规范等. 其中,有一个TTF字体,以前感觉没什么用.但是我在学习时,常看到有许多开发者使用Google 提供 ...

  7. 【Spark学习】Apache Spark for 第三方Hadoop分发版

    Spark版本:1.1.1 本文系从官方文档翻译而来,转载请尊重译者的工作,注明以下链接: http://www.cnblogs.com/zhangningbo/p/4137979.html

  8. 【bzoj3233】【ahoi2013】找硬币

    题意: 求确定n种货币面额x1..xn满足 x1=1 且xi为xj的整数倍(i>j) 给定n个物品价格ai 求使用上面货币最少需要硬币数(不能找零) 题解: 动态规划 听说网上的题解都是搜索的做 ...

  9. RabbitMQ C# 例子 -摘自网络

    //刚刚接触,如有不对还望不吝指正 public static void StartUp() { #region 前期准备工作 ConnectionFactory factory = new Conn ...

  10. linux 配置免密码登录

    主要就是两步 : 1. scp ~/.ssh/id_rsa.pub root@远程ip地址:~/ 2. cat id_rsa.pub >> ~/.ssh/authorized_keys,把 ...