C语言为什么可以重写标准库函数? 10

就比如printf函数,里面使用了一个输出函数intfputc(intch,FILE*f),然后就可以直接自己写一个相同名字的intfputc(intch,FILE*f)... 就比如printf函数,里面使用了一个输出函数int fputc(int ch,FILE *f),然后就可以直接自己写一个相同名字的int fputc(int ch,FILE *f)函数,只是通过什么形式把数据输出就完全是自己实现的​.函数重名了编译器为什么不会报错?
这个问题我还是自己解决一下吧。这是编译器搞得事情。在MDK软件中使用
__attribute__ ( (weak))
语句就能让一个函数变成弱属性,如果有相同的函数名,但是没有加这个属性的话,就会采用这个函数了,而声明为弱属性的函数就不会被调用
展开
 我来答
无人能渡我自渡
推荐于2020-02-13 · 超过26用户采纳过TA的回答
知道答主
回答量:62
采纳率:100%
帮助的人:50.9万
展开全部
这个问题是一个好问题,我之前也没思索过或者尝试过,
首先我们弄清楚一件事,函数声明可以放在任何头文件,实现可以放在任何实现该函数的源文件中,那么就存在一个问题:
编译时,到底优先去使用哪一个,为什么没有把标准库中的函数扩展过来;在windows下标准库被编译成了msvcr120.dll(msvcr100.dll,这里指release版),所以并不是扩展到代码中,而是在调用时动态链接;
而题主在其中自定义文件中实现了该函数,所以编译时找到了该函数的实现,并不会去链接dll(这应该是编译器做的一些工作,确定系统的dll需要加载哪些),所以题主的程序执行时就只有一份fputc了,并不冲突。
题主可以通过快捷键跳转声明就知道了,VS下,点选fputc实现函数按F12跳转到声明,指向的是stdio.h,再按一次跳转到你自己的定义了。Qt的话使用F2。
大概就是这样子了,可追问。
追问
那么我们是不是也可以将一些函数编译成.dll的形式,然后就可以将这些函数进行重写,或者说在源码中还要进行特别申明这些函数可以被重写?
追答
首先说明一点,这个实际上不应该叫重写。
我们也可以将自己写的函数编译成dll,然后另写一个同样的实现函数。
若你在程序中使用到该函数,编译时就会去寻找实现,而在你的源文件中有一份实现,你觉得编译器还会去寻找另外一份实现吗,而且对于动态库,编译时并不会去寻找实现,而是在如动态链接库.lib文件中知道该函数是动态连接及其内存地址。
如你要写与dll中重名的函数,不需要特别声明,只需像通常写函数一样
阳光的雷咩咩
2016-09-26 · TA获得超过1.4万个赞
知道大有可为答主
回答量:2.3万
采纳率:66%
帮助的人:7786万
展开全部
你看了标准库的源码?
追问
没有,只是需要重写一个fputc(),比较好奇。
追答
其实我没太明白你说的意思,能不能举具体代码例子
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式