有没有一种方法可以在C语言中指定函数的默认参数?
当前回答
No.
即使是最新的C99标准也不支持这一点。
其他回答
是的,有了C99的功能,你就可以这样做了。这种工作方式不需要定义新的数据结构,也不需要函数在运行时决定如何调用 没有任何计算开销。
有关详细的解释,请参阅我的帖子
http://gustedt.wordpress.com/2010/06/03/default-arguments-for-c99/
Jens
一般不会,但在gcc中,你可以使用宏将funcA()的最后一个参数设置为可选的。
在funcB()中,我使用了一个特殊的值(-1)来表示我需要'b'参数的默认值。
#include <stdio.h>
int funcA( int a, int b, ... ){ return a+b; }
#define funcA( a, ... ) funcA( a, ##__VA_ARGS__, 8 )
int funcB( int a, int b ){
if( b == -1 ) b = 8;
return a+b;
}
int main(void){
printf("funcA(1,2): %i\n", funcA(1,2) );
printf("funcA(1): %i\n", funcA(1) );
printf("funcB(1, 2): %i\n", funcB(1, 2) );
printf("funcB(1,-1): %i\n", funcB(1,-1) );
}
https://github.com/cindRoberta/C/blob/master/structure/function/default_parameter.c
#include<stdio.h>
void f_impl(int a, float b) {
printf("%d %g\n", a, b);
}
#define f_impl(...) f_macro(__VA_ARGS__, 3.7)
#define f_macro(a, b, ...) f_impl(a, b)
int main(void) {
f_impl(1);
f_impl(1, 2, 3, 4);
return 0;
}
你不需要只在c上使用VARARGS,下面是一个例子。
int funcA_12(int a1, int a2) { ... }
#define funcA(a1) funcA_12(a1, 0)
这个答案与上面的两个函数方法非常相似,但在这种情况下,您使用的是定义参数的函数名宏。
简单的回答:不。
稍微长一点的回答:有一个很老很老的解决方法,你传递一个字符串来解析可选参数:
int f(int arg1, double arg2, char* name, char *opt);
哪里的opt可能包括“name=value”对或其他东西,你会叫喜欢吗
n = f(2,3.0,"foo","plot=yes save=no");
显然,这只是偶尔有用。一般来说,当你想要一个单一的接口到一系列功能时。
你仍然可以在专业程序用c++编写的粒子物理代码中找到这种方法(例如ROOT)。它的主要优点是可以几乎无限期地扩展,同时保持向后兼容性。