是否可以在C函数中使用变量输入

Pat*_*der 1 c double int function

我正在做一个简单的函数来计算两个输入之间的差异.只是为了方便.在个人头文件中引用的东西.

我想输入:

两个整数:输出一个整数

两个双打:输出一个双

我曾尝试在线搜索某种全局输入声明,但找不到它.

我不喜欢有两个功能,只有一个简单功能.

示例代码头:int diff(int a,int b); 双差异(双a,双b);

谢谢您的帮助!

pax*_*blo 6

不,这称为重载,它不是C的功能.你最好创建不同的功能来处理这个问题.

可以使用各种C语言完成它(你可以用任何足够的C语言做任何事情),但结果代码可能是如此丑陋以至于无法维护:-)

例如,C11引入了带有_Generic主表达式的泛型选择,这允许您根据输入参数类型调用不同的函数.它确实比这更多,但这是你感兴趣的方面,基于你的问题.

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

int     diffi (int    a, int    b) { return a - b; }
double  diffd (double a, double b) { return a - b; }
Run Code Online (Sandbox Code Playgroud)

通常,必须根据输入类型决定调用哪个.C11通用选择功能允许您执行此操作:

#define diff(a,b)        \
    _Generic((a),        \
        double:  diffd,  \
        int:     diffi,  \
        default: diffX   \
    )(a,b)
Run Code Online (Sandbox Code Playgroud)

这基本上是diff(x,y)在源代码中找到宏时:

  • 确定表达式的类型(a),而不进行评估;
  • 将匹配该类型的令牌注入源流(如果未找到匹配则为默认值);
  • 在源流中注入(a,b)最后的文本.

因此,如果您的源文件包含以下行:

x = diff (1,   2);
y = diff (1.0, 2);
Run Code Online (Sandbox Code Playgroud)

这将被翻译成:

x = diffi (1  , 2);
y = diffd (1.0, 2);
Run Code Online (Sandbox Code Playgroud)

为您提供有效的超载.

现在这是一个中等容易的情况因为它只依赖于第一个参数类型 - 如果你试图这样做,你会看到一个洞:

z = diff (1, 2.0);
Run Code Online (Sandbox Code Playgroud)

因为第一个参数的类型是一个int所以你会得到:

z = diffi (1, 2.0);
Run Code Online (Sandbox Code Playgroud)

这不是你真正想做的事情.这是复杂性的来源,因为你必须涵盖四种可能性:{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)
Run Code Online (Sandbox Code Playgroud)

这可以理解为:

  • 如果adouble,使用diffd;
  • 否则,如果bdouble,则使用diffd;
  • 否则,使用diffi.
  • 不要忘记注入参数.

以下完整程序(编译clang 3.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;
}
Run Code Online (Sandbox Code Playgroud)

该计划的输出是:

diffi 1 2 --> -1
diffd 1.000000 2.000000 --> -1.000000
diffd 1.000000 2.000000 --> -1.000000
diffd 1.000000 2.000000 --> -1.000000
Run Code Online (Sandbox Code Playgroud)

表明正在为四种可能性调用正确的函数.


事实上,正如rici在评论中指出的那样,你可以依赖C的推广规则,其中添加a doubleint(以任意顺序)给你一段double时间添加两个int变量会给你一个int:

#define diff(a,b) _Generic((a+b), double:diffd, default:diffi)(a,b)
Run Code Online (Sandbox Code Playgroud)