c - 关于 C 函数,其唯一区别是某些参数的数据类型

标签 c

假设我有两个不同的函数(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/

相关文章:

c - 使用 snprintf 进行字符串连接

c - 代码中制作 head 和 n 有什么区别

c++ - 为什么 C++11 不支持 C99 指定的初始化列表?

c - C标准库的位置

c++ - 我如何在 FreeBSD 上禁用 ASLR?

c - 当我尝试使用函数中通过引用传递的预分配矩阵读取值时出现段错误

c - 对 printf 的嵌套调用

c++ - 如何在 Windows 上紧密打包结构?

java - JNI : Can not get array length

c - 关于C中scanf的转换说明符