C函数的模拟重载实现说明

原创 2015年07月08日 14:43:26

在研究printf是,这是一个变参函数,是否可以用这个特性写一个重载函数,当然只是实现模拟。
谷歌说c++实现函数重载是这样的,C++ 实现函数重载很大程度上依赖与编译器对函数名的 Mangling(损坏,破坏),即 C++ 的源代码被编译后同名的重载函数名字会被破坏,一般是在原函数名前后加上特定的字符串,以区分不同重载函数,然后在调用的时候根据参数的不同选择合适的函数。

从网上搞到一段代码

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

void var_args_func(const char * fmt, ...) 
{
    char    *ap;

    ap = ((char*)&fmt) + sizeof(fmt);
    printf("%d\n", *(int*)ap);  

    ap =  ap + sizeof(int);
    printf("%d\n", *(int*)ap);

    ap =  ap + sizeof(int);
    printf("%s\n", *((char**)ap));
}

int main()
{
    var_args_func("%d %d %s\n", 4, 5, "hello world");
    return 0;
}

这里写图片描述
完全是根据c压栈,将栈中的东西抠出来。

虽然好像还是没能达到重载的目的。。。。。。。。。

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

c函数重载的实现

函数重载是C++中特有的,在C语言中没有。 函数重载的定义:指在同一作用域内,可以有一组相同函数名,不同参数列表的函数,这组函数称为重载函数。      int Add(int a, int b)  ...

c sharp 中的函数重载

  • 2008-03-11 17:23
  • 21KB
  • 下载

C++函数重载实现的原理以及为什么在C++中调用C语言编译的函数时要加上extern "C"声明

C++相对于C语言而言支持函数重载是其极大的一个特点,相信在使用C语言的时候大家如果要写一个实现两个整型数据相加的函数还要写一个浮点型数据相加的函数,那么这两个函数的名字绝对不可以一样,这样无疑在我们...

模拟实现C库函数strcpy,strcat,strstr,strchr,strcmp,memcpy,memmove

1、模拟实现strcpy char *my_strcpy( char *dest, const char *str) { assert(dest != NULL); assert(str != N...

模拟退火算法求函数最小值问题的C/C++实现

1、模拟退火算法简介 模拟退火算法(Simulated Annealing,SA)最早的思想是由N. Metropolis等人于1953年提出。1983 年,S. Kirkpatrick 等成功...

JS模拟面向对象全解(三、函数重载)

马上就要进入JS面向对象的阶段了,在这之前,我们在了解一下JS这个“新换旧”的语言如何模拟实现函数重载。——先了解一下JS的“新换旧”特性:function show(x){ alert(x);...

C++基础篇—函数重载与Extern C

问题引出     之前提到C存在命名冲突问题,新的C++专门为此引入了namespace机制加以改进(后文介绍),此外还有另一种机制:     int add(int i, int j) {    r...
  • ipmux
  • ipmux
  • 2015-02-27 18:23
  • 1264

c,c++函数重载的区别

1 在C++ 程序中调用被 C 编译器编译后的函数,为什么要加 extern “C” ? 答:C++语言支持函数重载,C 语言不支持函数重载。函数被C++编译后在库中的名字 与C 语言的...

从零开始学C++之从C到C++(一):const与#define、结构体对齐、函数重载name mangling、new/delete 等

一、bool 类型 逻辑型也称布尔型,其取值为true(逻辑真)和false(逻辑假),存储字节数在不同编译系统中可能有所不同,VC++中为1个字节。 声明方式:bool result; result...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)