C語言預設引數值的實現

-柚子皮-發表於2014-05-10

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

#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

相關文章