在C函数中可以有可变输入吗

在C函数中可以有可变输入吗,c,function,int,double,C,Function,Int,Double,我正在做一个简单的函数来计算两个输入之间的差值。只是为了方便,真的。要在个人头文件中引用的内容 我想输入以下信息: 两个整数:输出一个整数 两倍:输出一倍 我尝试在网上搜索某种全局输入声明,但找不到 我不希望有两个函数,只有一个简单的函数 示例代码头: 内部差异(内部a、内部b); 双差(双a、双b) 谢谢你的帮助 在C中不可用。 一些可能的解决办法 使用两个具有不同名称的函数作为ex:diff_i和diff_d (推荐) 使用(不推荐)这将使代码难以随时间进行维护 使用 在C语言中不可用。 一

我正在做一个简单的函数来计算两个输入之间的差值。只是为了方便,真的。要在个人头文件中引用的内容

我想输入以下信息:

两个整数:输出一个整数

两倍:输出一倍

我尝试在网上搜索某种全局输入声明,但找不到

我不希望有两个函数,只有一个简单的函数

示例代码头: 内部差异(内部a、内部b); 双差(双a、双b)

谢谢你的帮助

在C中不可用。 一些可能的解决办法

  • 使用两个具有不同名称的函数作为ex:diff_i和diff_d (推荐)
  • 使用(不推荐)这将使代码难以随时间进行维护
  • 使用
  • 在C语言中不可用。 一些可能的解决办法

  • 使用两个具有不同名称的函数作为ex:diff_i和diff_d (推荐)
  • 使用(不推荐)这将使代码难以随时间进行维护
  • 使用

  • 不,这叫做重载,它不是C的特性。最好创建不同的函数来处理这个问题

    您可以使用各种C向导(您可以使用足够的C向导做任何事情),但是生成的代码可能非常难看,无法维护:-)

    例如,C11使用
    \u generic
    主表达式引入了泛型选择,这允许您根据输入参数类型调用不同的函数。事实上,它的作用远不止这些,但根据你的问题,这是你感兴趣的方面

    例如,假设您定义了两个函数:

    int     diffi (int    a, int    b) { return a - b; }
    double  diffd (double a, double b) { return a - b; }
    
    通常,您必须根据输入类型来决定调用哪个。C11通用选择功能允许您执行以下操作:

    #define diff(a,b)        \
        _Generic((a),        \
            double:  diffd,  \
            int:     diffi,  \
            default: diffX   \
        )(a,b)
    
    这基本上是在源代码中查找宏
    diff(x,y)

    • 确定表达式的类型
      (a)
      ,而不对其求值
    • 将与该类型匹配的令牌注入源流(如果未找到匹配项,则为默认值)
    • 将末尾的
      (a,b)
      文本注入源流
    因此,如果源文件包含以下行:

    x = diff (1,   2);
    y = diff (1.0, 2);
    
    这将转化为:

    x = diffi (1  , 2);
    y = diffd (1.0, 2);
    
    给你有效的超载

    这是一个相当简单的例子,因为它只依赖于第一个参数类型-如果您尝试执行以下操作,您将看到一个漏洞:

    z = diff (1, 2.0);
    
    因为第一个参数的类型是
    int
    ,所以您将得到:

    z = diffi (1, 2.0);
    
    这不是你真正想做的。这就是复杂性所在,因为您必须涵盖四种可能性:
    {int/int,int/double,double/int,double/double}
    ,并且根据参数的数量和每个参数的可能类型,它变得更复杂

    但是,您的完整案例可以通过明智地使用默认值和嵌套的泛型选择来完成,例如:

    #define diff(a,b)              \
        _Generic((a),              \
            double:  diffd,        \
            default: _Generic((b), \
                double:  diffd,    \
                default: diffi     \
            )                      \
        )(a,b)
    
    这可以理解为:

    • 如果
      a
      的类型为
      double
      ,则使用
      diffd
    • 否则,如果
      b
      的类型为
      double
      ,则使用
      diffd
    • 否则,请使用
      diffi
    • 不要忘了插入参数
    以下完整的程序(使用
    clang3.0
    编译)显示了此功能的作用:

    #include <stdio.h>
    
    int diffi (int a, int b) {
        printf ("diffi %d %d", a, b);
        return a - b;
    }
    double diffd (double a, double b) {
        printf ("diffd %f %f", a, b);
        return a - b;
    }
    
    #define diff(a,b)              \
        _Generic((a),              \
            double:  diffd,        \
            default: _Generic((b), \
                double:  diffd,    \
                default: diffi     \
            )                      \
        )(a,b)
    
    int main (void) {
        int i; double d;
        i = diff (1  , 2  ); printf (" --> %d\n", i);
        d = diff (1.0, 2  ); printf (" --> %f\n", d);
        d = diff (1  , 2.0); printf (" --> %f\n", d);
        d = diff (1.0, 2.0); printf (" --> %f\n", d);
        return 0;
    }
    
    显示为四种可能性调用了正确的函数


    事实上,正如一篇评论中所指出的,你可以依赖C的升级规则,其中添加一个
    double
    int
    (按任何顺序)会给你一个
    double
    ,而添加两个
    int
    变量会给你一个
    int

    #define diff(a,b) _Generic((a+b), double:diffd, default:diffi)(a,b)
    

    不,这叫做重载,它不是C的特性。最好创建不同的函数来处理这个问题

    您可以使用各种C向导(您可以使用足够的C向导做任何事情),但是生成的代码可能非常难看,无法维护:-)

    例如,C11使用
    \u generic
    主表达式引入了泛型选择,这允许您根据输入参数类型调用不同的函数。事实上,它的作用远不止这些,但根据你的问题,这是你感兴趣的方面

    例如,假设您定义了两个函数:

    int     diffi (int    a, int    b) { return a - b; }
    double  diffd (double a, double b) { return a - b; }
    
    通常,您必须根据输入类型来决定调用哪个。C11通用选择功能允许您执行以下操作:

    #define diff(a,b)        \
        _Generic((a),        \
            double:  diffd,  \
            int:     diffi,  \
            default: diffX   \
        )(a,b)
    
    这基本上是在源代码中查找宏
    diff(x,y)

    • 确定表达式的类型
      (a)
      ,而不对其求值
    • 将与该类型匹配的令牌注入源流(如果未找到匹配项,则为默认值)
    • 将末尾的
      (a,b)
      文本注入源流
    因此,如果源文件包含以下行:

    x = diff (1,   2);
    y = diff (1.0, 2);
    
    这将转化为:

    x = diffi (1  , 2);
    y = diffd (1.0, 2);
    
    给你有效的超载

    这是一个相当简单的例子,因为它只依赖于第一个参数类型-如果您尝试执行以下操作,您将看到一个漏洞:

    z = diff (1, 2.0);
    
    因为第一个参数的类型是
    int
    ,所以您将得到:

    z = diffi (1, 2.0);
    
    这不是你真正想做的。这就是复杂性所在,因为您必须涵盖四种可能性:
    {int/int,int/double,double/int,double/double}
    ,并且根据参数的数量和每个参数的可能类型,它变得更复杂

    但是,您的完整案例可以通过明智地使用默认值和嵌套的泛型选择来完成,例如:

    #define diff(a,b)              \
        _Generic((a),              \
            double:  diffd,        \
            default: _Generic((b), \
                double:  diffd,    \
                default: diffi     \
            )                      \
        )(a,b)
    
    这可以理解为:

    • 如果
      a
      的类型为
      double
      ,则使用
      diffd
    • 否则,如果t