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)
{