我有这个功能:
void func(int a, int b, char s, FILE *fp, int flag)
我希望根据标志使用函数的args。例如:
func(num, NOTHING, NOTHING, file, 1)
func(num, othernum, NOTHING, NOTHING, 2)
以及我希望拥有的this_is_function
函数:
void func(int a, int b, char s, FILE *fp, int flag){
if(flag == 1){
/* use a and file */
}
if(flag == 2){
/* use a,b */
}
/* etc etc */
}
我想知道是否有可能以及如何做到这一点!
提前谢谢:)
答案 0 :(得分:4)
如果NOTHING
你的意思是你真的想省略那个论点,我认为这不可能就像你概述的那样。
通常在C中完成此操作的方法是variable argument lists。这意味着你必须重新制定,以便flag
先行,因为它决定了其余的论点:
void func(int flag, ...)
{
va_list args;
int num, othernum;
FILE *file;
va_start(args, flag);
if(flag == 1)
{
num = va_arg(args, int);
file = va_arg(args, FILE *);
}
else if(flag == 2)
{
num = va_arg(args, int);
othernum = va_args(args, int);
}
va_end(args);
/* Inspect `flag` again, and do things with the values we got. */
}
然后您可以使用如下函数:
func(1, 42, a_file);
或
func(2, 17, 4711);
这当然需要非常小心,因为您不再需要编译器的大量帮助来匹配调用中提供的函数所期望的值。
我建议将其重组为不同的顶级函数,使用正确的参数调用常见的“worker”函数:
func_mode1(42, a_file);
func_mode2(17, 4711);
然后,这些可以使用正确的func()
值调用flag
,为不适用的参数填充合适的默认值(例如,对于未使用的文件指针,NULL
)。
答案 1 :(得分:2)
为您尝试处理的每个案例创建单独的函数。这将产生更易读的代码。通过代码陈述你的意图,而不是破解它。
答案 2 :(得分:2)
当您调用函数并且未使用参数时,您可以将0
传递给int
和char
以及NULL
作为指针。
func(num, 0, 0, file, 1)
func(num, othernum, 0, NULL, 2)
您还可以使用可变参数函数。可变参数函数是具有可变数量参数的函数。
答案 3 :(得分:1)
您的代码应该可以正常运行,然后尝试一次并检查是否有任何错误。我确信不会发生任何错误。您还可以尝试在func中使用switch
个案,flag
作为choice
的{{1}}。我相信您不会在代码中使用switch
和Nothing
。