gpt4 book ai didi

c - C函数中是否可以有变量输入

转载 作者:太空宇宙 更新时间:2023-11-04 00:18:14 24 4
gpt4 key购买 nike

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

我想输入:

两个整数:输出一个整数

two doubles : 输出一个double

我试过在线搜索某种全局输入声明但找不到。

我不希望有两个功能,只有一个简单的功能。

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

感谢您的帮助!

最佳答案

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

可以用各种 C 魔法来完成它(你可以用足够的 C 魔法做任何事情),但是生成的代码可能非常难看无法维护:-)

例如,C11 引入了泛型选择,使用 _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) 的类型,而不对其求值;
  • 将匹配该类型的 token 注入(inject)源流(如果未找到匹配项,则默认);
  • (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} 并且它得到 < em>更复杂,基于参数的数量和每个参数的可能类型。

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

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

这可以理解为:

  • 如果a的类型是double,使用diffd
  • 否则,如果b的类型是double,则使用diffd
  • 否则,使用diffi
  • 别忘了注入(inject)参数。

以下完整程序(使用 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;
}

该程序的输出是:

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

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


事实上,作为rici在评论中指出,您可以依赖 C 的提升规则,其中添加 doubleint (以任何顺序)会给您一个 double 同时添加两个 int 变量会得到一个 int:

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

关于c - C函数中是否可以有变量输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26479273/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com