假设我有两个不同的函数(C),它们之间的唯一区别是它们的一些参数具有不同的数据类型(我现在正在考虑 CBLAS)。例如:
void cblas_dgemm(const enum CBLAS_ORDER Order, const enum CBLAS_TRANSPOSE TransA,
const enum CBLAS_TRANSPOSE TransB, const int M, const int N,
const int K, const double alpha, const double *A,
const int lda, const double *B, const int ldb,
const double beta, double *C, const int ldc);
void cblas_sgemm(const enum CBLAS_ORDER Order, const enum CBLAS_TRANSPOSE TransA,
const enum CBLAS_TRANSPOSE TransB, const int M, const int N,
const int K, const float alpha, const float *A,
const int lda, const float *B, const int ldb,
const float beta, float *C, const int ldc);
不要将此函数定义两次,只是某些数据类型不同,是否有更智能的方法来拥有这两个函数?比如编译器指令什么的?
编辑(不确定stackoverflow是否允许这个问题):我正在考虑这些函数编译后的样子。我的想法正确吗? “由于单精度加法和 double 加法在硬件级别是不同的指令,即使修改 C 编译器以允许问题所讨论的函数类型,最终的二进制文件也会相似,因为我们需要有两个不同的函数也在二进制文件中吗?”
最佳答案
不,这是不可能的。在 C 语言中,每个函数名对应一个全局唯一的函数。这就是为什么 C 库(包括标准库)充满了以 f
结尾的函数变体。/l
/ul
/ull
等等
C++ 的设计中已经认识到了这一限制,其中包括重载解析;然而,这是一个相当复杂的过程,除其他外,C++ 没有通用的 ABI,这与 C 在实践中不同。因此,通用库仍然符合 C 接口(interface)(并且 extern "C"
C++ 中的函数不能重载)。
C 是一种简单的语言,易于实现,这意味着它并不是一切都让人舒服。
更新:考虑例如运行时链接dlsym()
或GetProcAddress()
。这些工作完全按名称进行,由简单的 C ABI 提供。动态链接(或者只是链接)不是 C 标准的一部分,尽管如此,这是一个非常有用的工具,但它不能很好地与重载配合使用。
关于c - 关于 C 函数,其唯一区别是某些参数的数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8334962/