浅谈 C 语言实现重载,多态和模板

本文探讨了C语言如何实现类似重载、多态和模板的功能。尽管C语言本身不支持这些特性,但通过解析函数参数、可变参数列表和预处理宏等方法,可以模拟实现。文中引用了相关文章和代码示例进行详细解释,并提供了参考资料供读者深入研究。
摘要由CSDN通过智能技术生成

C 语言实现重载,多态和模板

为什么 C 语言不支持重载

这和 C 和 C++ 的函数名称修饰有关。编译(并汇编)一个 C 和 Cpp 程序,使用 objdump -dS命令查看 ELF 格式文件发现:

[root@SuperhandsomeChuan ~]# objdump -dS test.o

0000000000000000 <main>:

[root@SuperhandsomeChuan ~]# objdump -dS testcpp.o

0000000000000000 <_Z3sumii>:

0000000000000014 <_Z3sumdd>:

gcc 编译器下,C 程序的函数名没有变化,但是 Cpp 程序的函数名称有了参数相关的后缀,这使得重载的 sum 函数底层的函数名称不同,编译器可以区分。

C 语言实现重载
函数 描述
col 3 is right-aligned
va_list arg_ptr 定义一个可变参数列表指针
va_start(arg_ptr, argN) 让arg_ptr指向参数argN
va_arg(arg_ptr, type) 返回类型为type的参数指针,并指向下一个参数
va_copy(dest, src) 拷贝参数列表指针,src->dest,
va_end(arg_ptr) 清空参数列表,并置参数指针arg_ptr无效。每个va_start()必须与一个va_end()对应

参考文章:http://locklessinc.com/articles/overloading/

#include<stdio.h>
#include<stdarg.h>

void va_overload2(int p1, int p2)
{
   
  printf("va_overload2 %d %d\n", p1, p2);
}

void va_overload3(int p1, int p2, int p3)
{
   
  printf("va_overload3 %d %d %d\n", p1, p2, p3);
}

static void va_overload(int p1, int p2, ...)
{
   
  if(p2 == 7)
  {
   
    va_list v;
    va_start(v, p2);
    
    int p3 = va_arg(v, int); 
    va_end(v);
    va_overload3(p1, p2, p3);

    return;
  }
  va_overload2(p1, p2);
}

int main(void)
{
   
  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值