替代 C 中的函数重载? [复制]

Posted

技术标签:

【中文标题】替代 C 中的函数重载? [复制]【英文标题】:Alternative to function overloading in C? [duplicate] 【发布时间】:2019-06-21 23:32:47 【问题描述】:

既然 C 语言中不允许直接进行函数重载,那么这些函数如何实现呢?

void MotorDriver_Create(float speedAddress,float frequencyAddress, float db_input);
void MotorDriver_Create(float speedAddress, float frequencyAddress, float minDB, float maxDB);

【问题讨论】:

你创建两个函数并调用任何合适的函数。 这将是更简单的解决方案,但我不允许这样做。 @Anku 你不被允许?这是什么意思? 我正在尝试开发独立于硬件的代码,该代码可以初始化参数中变量的值,并根据参数的数量使用上述功能之一。该代码适用于 Java/C++,但由于该代码应该在 C 上运行,因此需要一种方法来执行相同的操作。 @LeedMx extern 关键字确实指定了外部链接,但这也是文件范围声明的默认值,包括 all 函数。只有声明为static 的函数具有内部链接。没有上下文、环境或范围允许 C 语言通过相同的名称访问不同的对象或函数,除了接受的答案中描述的通用选择之外,这实际上不是一回事。 【参考方案1】:

没有办法实现类似于 C++ 中可用的函数重载,因为与 C++ 不同,函数签名不会以允许重载的方式进行修改。您可以做的是使用_Generic 关键字将宏映射到最适合参数类型的函数调用。例如:

#include <math.h>
#include <float.h>
#define sqrt(X) _Generic((X), \
            long double: sqrtl, \
            default: sqrt, \
            float: sqrtf \
)(X)

【讨论】:

那个。是。苏。凉爽的!不知道这个关于C 这是 C11 的一部分。以前没有。 @EugeneSh。确实,c 的标签信息鼓励贡献者使用最新版本 @GovindParmar 当然,这是 c18 AFAIK :) 没有异议,只是对 smac89 评论的评论。 我看到 OP 接受了这个答案,这很好,但我注意到提出的问题是关于基于参数数量的重载。据我所知,通用选择并没有提供解决方案。

以上是关于替代 C 中的函数重载? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

函数重载在 C 中有效吗? [复制]

c++中拷贝构造函数和赋值运算符重载本质上一样么

c ++错误 - 函数不能重载[重复]

c++ 拷贝构造函数与赋值运算符重载函数的区别是

c语言怎么写重载函数?

C/C++编程笔记:C++中的函数重载