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