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. [Everyday Mathematics]20150124

    设 $A,B$ 是同阶方阵, 满足 $AB+A+B=0$. 试证: $AB=BA$.

  2. 六种排序的C++实现

    class SortNum { public: SortNum(); virtual ~SortNum(); void exchange(int& b,int& c);//交换数据 v ...

  3. Linux基本命令(5)管理使用者和设立权限的命令

    管理使用者和设立权限的命令 命令 说明 命令 说明 chmod 用来改变权限 useradd 用来增加用户 su 用来修改用户     5.1 chmod命令 chmod命令用来改变许可权限.读取.写 ...

  4. Objective-C异步编程

    1. 不要阻塞主线程 不管在进行iOS还是OS X开发中,主线程都只应该处理用户交互和界面布局,好的程序通常能够随时快速响应用户的操作,所以CPU密集型或者会阻塞线程的代码应该在其他位置去执行,我指的 ...

  5. 检查ept

    cat /proc/cpuinfo | grep ept                                检查cpu是否支持ept cat /sys/module/kvm_intel/p ...

  6. JAVA——利用wait和notify实现生产者和消费者

    经典的消费者和生产者的的实现: 注意事项: 1:在循环里面用wait(),因为当线程获得了锁,但是有可能还没有满足其他条件: 2:公用的缓冲池要用锁机制: package demo; import j ...

  7. AHOI2013 Round2 Day1 简要题解

    第一题,好吧这是个dp.(搜素也能在BZOJ上卡过). 第二题,BFS搜索碰到的立方体面数,智硬没有想到... 第三题,其实一看就有思路,但关键是求x坐标不交的矩形对数+y坐标不交的矩形对数 - x, ...

  8. (转)php的扩展和嵌入--php的生命周期与变量详述

    本文转自http://blog.csdn.net/cedricliang/article/details/17247749?9435:这是在我想在js的循环中加入一段php,这段php代码会在每次执行 ...

  9. poj 1679 http://poj.org/problem?id=1679

    http://poj.org/problem?id=1679 The Unique MST Time Limit: 1000MS   Memory Limit: 10000K Total Submis ...

  10. Chrome的Postman的使用

    Chrome提供了一个很好的Web App 名为 Postman 使用这个web app,你可以输入一个url,然后可以很清楚的看到返回的各种结果 直接在Google中输入Postman, 找到它   ...