如何定义使用或不使用参数调用的函数?

时间:2013-08-16 14:29:39

标签: c

我需要在C中开发一个函数,它将使用相同的定义调用,有或没有这样的参数:

char *fnc(???) 
{
    char *str;
    ....
    return str;
}
char *c1 = fnc();
char *c2 = fnc(param);

怎么做?

9 个答案:

答案 0 :(得分:3)

这称为Function Overloading您不能在C

中执行此操作

答案 1 :(得分:2)

你无法在C中达到你想要的目标。

你有一些选择:

  • 将您的函数声明为varargs函数,并使用va_宏访问可选参数(请注意,在这种情况下,您需要至少有一个固定 - 非可选 - 参数,并且您还需要知道你传递的剩余参数的类型)

  • 使用可变参数宏定义来包装函数名称并根据需要调用实际函数 - 您仍然需要使实数函数可变参数,但可变参数宏不需要首先使用固定参数。

如果其中任何一个听起来很有帮助,我可以用例子来阐明。

答案 2 :(得分:2)

可以使用旧的varargs.h 你有

void varfunc( va_alist )
va_dcl
{
     va_list args;
     char    *p1;

     va_start( args );
     p1 = va_arg( args, char * );  /* any type is possible */
     ...
     va_end( args );
}

使用现代stdarg.h,它不再可能。您可以使用变量参数定义函数,但必须始终按原样修复:

void varfunc( int fixedArg, ... )  // of course fixedArg can be of any type 
{
     va_list  args;
     char     *p1;


     va_start( args, fixedArg );  // here you need the fixed one
     p1 = va_arg( args, char * ); // again any type i possible
     ...
     va_end( args );
}

有一个很明显的原因,为什么没有固定参数的语法没有意义:因为没有可移植的方法来确定传递了多少和哪种类型的参数,你需要在固定参数中使用该信息,这是例如<{1}}系列中的格式字符串,或者只是一些参数,一些位标志或其他。

答案 3 :(得分:1)

使用C++而不是C,或传递NULL指针:

void fnc(char* Optional)
{
    if (Optional != NULL)
    {
       // do something amazing
    }
}

fnc(NULL); // "Not passing" a parameter
fnc("hello");

答案 4 :(得分:1)

在C中你不能直接这样做,你必须经历一个宏。变量参数宏与变量参数函数不同,因为它们允许参数为空。然后你必须检测参数是否实际为空,并为最终函数调用提供默认参数。

我有一个宏程序包P99,可以为您完成所有包装。一种可能性是声明像

这样的东西
#define fnc(...) P99_CALL_DEFARG(fnc_imp, 1, __VA_ARGS__)
#define fnc_defarg_0() (char const*)0

void fnc_imp(char const* arg) {
  if (!arg) {
    /* do something special */
  }
  /* your code */
}

请注意,在C中,宏可能与函数同名,如果您没有发现这一点令人困惑,那么您甚至可以将函数命名为fnc

答案 5 :(得分:1)

解决问题的正确方法是认识到你不应该首先为两种不同的情况使用一种功能;因为这几乎没有意义,并且会产生代码维护问题(例如,很难检测到“错误数量的参数”错误)。

例如,您可以foo_simple(void)(内部)调用foo_complex(arg1, arg2);其他代码可以使用哪个函数让他们开心。

答案 6 :(得分:0)

这里似乎有很多错误的答案。你想要的就像printf,它可以带0个参数,或者它可能需要很多。要模仿这个,你可以使用函数中的...说明符。

 function variableArguments(void * typeDefinition, ...);

你可以将void *转换为你想要的任何东西,即使它不是通过传入非指针值的地址的指针。

答案 7 :(得分:0)

你可以结合使用:

1

#define function() function(NULL)
void function(void * parameter)
{
    if (parameter != NULL)
    { /*code*/ }
}

2:

void function(void * parameter)
{
    if (parameter != NULL)
    { /*code*/ }
}
call: func(NULL); or func(ptr);

3:

use a va_list

4:

我不确定C是否处理此问题,但您/可能/可以使用默认参数

void function(void * parameter = NULL)
{
     if (parameter != NULL)
     { /*code*/ }
}

答案 8 :(得分:0)

在C ++中,这很容易:

char *fnc(parameter=default_value){
....
}

因此,如果调用不带参数的函数,函数参数的值将为“default_value”。如果使用参数调用该函数,则函数参数的值将是函数调用中的值。如果您有多个参数,请不要忘记在参数列表的末尾添加一个默认值的参数!

顺便说一句,抱歉我的英语不好,如果我错了,请告诉我。我是编程aprentice: - )