Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何定义将使用或不使用参数调用的函数?_C - Fatal编程技术网

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

C 如何定义将使用或不使用参数调用的函数?,c,C,我需要在C中开发一个函数,该函数将使用相同的定义调用,包括或不包括如下参数: char *fnc(???) { char *str; .... return str; } char *c1 = fnc(); char *c2 = fnc(param); 如何?< /p> < p>这是不能在c< /p> 中做的。这叫做C~(p)/p>p>p>使用C++而不是C,或传递空指针: 使用C++而不是C,或传递空指针: 这里似乎有很多被误导的答案。您需要的是printf,它可以

我需要在C中开发一个函数,该函数将使用相同的定义调用,包括或不包括如下参数:

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

如何?< /p> < p>这是不能在c< /p> 中做的。这叫做C~(p)/p>p>p>使用C++而不是C,或传递空指针:

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


这里似乎有很多被误导的答案。您需要的是printf,它可以接受0个参数,也可以接受多个参数。要模仿这一点,请使用。。。函数中的说明符

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

您可以通过传入非指针值的地址,将void*强制转换为您想要的任何对象,即使它不是指针

这里似乎有很多被误导的答案。您需要的是printf,它可以接受0个参数,也可以接受多个参数。要模仿这一点,请使用。。。函数中的说明符

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

您可以通过传入非指针值的地址,将void*强制转换为您想要的任何对象,即使它不是指针

在C语言中,你无法实现你想要的东西

您确实有一些可用的选项:

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

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


如果这些听起来有帮助的话,我可以举例说明。

在C语言中,你不能完全实现你想要的

您确实有一些可用的选项:

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

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


如果这些听起来有帮助,我可以举例说明。

可以使用旧的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 );
}
使用现代标准,这已经不可能了。可以使用变量参数定义函数,但必须始终保持一个固定参数不变:

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 );
}

没有固定参数的语法没有意义有一个非常明显的原因:因为没有可移植的方法来确定传递了多少个和什么类型的参数,所以在固定参数中需要这些信息,例如printf系列中的格式字符串,或者可能只是一些参数,一些位标志或任何东西。

可以使用旧的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 );
}
使用现代标准,这已经不可能了。可以使用变量参数定义函数,但必须始终保持一个固定参数不变:

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 );
}

没有固定参数的语法没有意义有一个非常明显的原因:因为没有可移植的方法来确定传递了多少个和什么类型的参数,所以在固定参数中需要这些信息,例如printf系列中的格式字符串,或者可能只是一些参数,一些位标志或任何东西。

您可以结合使用:

1: 2: 三: 4: 我不确定C是否能处理这个问题,但您/可能/能够使用默认参数

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

您可以结合使用以下各项:

1: 2: 三: 4: 我不确定C是否能处理这个问题,但您/可能/能够使用默认参数

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

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

我有一个宏包,可以为您完成所有包装工作。一种可能是声明如下内容

#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。

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

我有一个宏包,可以为您完成所有包装工作。一种可能是声明如下内容

#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。 这很简单:

char *fnc(parameter=default_value){
....
}
因此,如果调用不带参数的函数,函数参数的值将是默认值。如果使用参数调用函数,函数参数的值将是函数调用中的值。如果有多个参数,请不要忘记将带有默认值的参数放在参数列表的末尾

顺便说一句,很抱歉我的英语不好,如果我错了,请告诉我。我是C++编程的一个程序:-

,这很容易:

char *fnc(parameter=default_value){
....
}
因此,如果调用不带参数的函数,函数参数的值将是默认值。如果使用参数调用函数,函数参数的值将是函数调用中的值。如果有多个参数,请不要忘记将带有默认值的参数放在参数列表的末尾


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

解决这个问题的正确方法是认识到你不应该在一开始就把一个函数用于两种不同的情况;因为这通常是毫无意义的,并且会造成代码维护问题,例如,很难检测到错误数量的参数错误


例如,您可以有一个foo_simplevoid,它在内部调用foo_complexarg1,arg2;其他代码可以使用任何让他们满意的函数。

解决问题的正确方法是认识到,您首先不应该将一个函数用于两种不同的情况;因为这通常是毫无意义的,并且会造成代码维护问题,例如,很难检测到错误数量的参数错误



例如,您可以有一个foo_simplevoid,它在内部调用foo_complexarg1,arg2;在其他代码可以使用的任何一个函数都使它们高兴的情况下。

如果使用C++,可以使用默认参数来执行,声明char *fncMyType MyPARAM= MyOrthReale.但是,唉,C并没有做到这一点。如果他们足够关心,这将是对ANSI C标准的一个很好的补充你们放弃了OP,把他推到C++。吉姆,我不会把任何人推到任何地方。我只是说;如其他答案所示,函数重载、变量参数(如printf)和默认参数都是不同的。变量参数至少需要一个参数,这不符合OP的示例。如果没有至少一个参数,如何告诉您有多少个参数?你是想通过全局或什么东西进行通信吗?如果你使用C++,你可以使用默认参数,声明char *fncMyType MyPARAM= MyOrthRead。但是,唉,C并没有做到这一点。如果他们足够关心,这将是对ANSI C标准的一个很好的补充你们放弃了OP,把他推到C++。吉姆,我不会把任何人推到任何地方。我只是说;如其他答案所示,函数重载、变量参数(如printf)和默认参数都是不同的。变量参数至少需要一个参数,这不符合OP的示例。如果没有至少一个参数,如何告诉您有多少个参数?您的意思是通过globals或其他方式进行通信吗?printf和其他varargs函数至少需要1个参数,但您将始终至少有一个参数。如果您有指定不使用该参数的标识符,则可以丢弃该参数。当您遍历参数列表时,它将出现在switch语句或while循环中。printf和其他varargs函数至少需要1个参数,但始终至少有一个参数。如果您有指定不使用该参数的标识符,则可以丢弃该参数。当您浏览参数列表时,它将出现在switch语句或while循环中。或者默认参数,在C中也不可用。是的,您可以。参见printf。有很多“在C中你不能做”的事情是人们实际做的,比如oop=@Jim,printf不是重载的,它是一个可变函数。你可以用宏或默认参数实现类似于函数重载的功能,在C中也不可用。是的,你可以做到。参见printf。有很多“你不能在C中做”的事情是人们实际上做的,比如oop=@Jim,printf没有过载,这是一个函数,你可以用C++语言来实现类似于函数重载的宏,需要在C语言中开发一个函数。答案是在C.,唯一的部分不是说使用C++的ORI需要用C语言开发函数……答案是在C.,唯一的部分不是那就是说使用C++ ORNO,你不需要使实函数可变不,你不需要使实函数可变