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))
语句就能让一个函数变成弱属性,如果有相同的函数名,但是没有加这个属性的话,就会采用这个函数了,而声明为弱属性的函数就不会被调用 展开
这个问题我还是自己解决一下吧。这是编译器搞得事情。在MDK软件中使用
__attribute__ ( (weak))
语句就能让一个函数变成弱属性,如果有相同的函数名,但是没有加这个属性的话,就会采用这个函数了,而声明为弱属性的函数就不会被调用 展开
2个回答
展开全部
这个问题是一个好问题,我之前也没思索过或者尝试过,
首先我们弄清楚一件事,函数声明可以放在任何头文件,实现可以放在任何实现该函数的源文件中,那么就存在一个问题:
编译时,到底优先去使用哪一个,为什么没有把标准库中的函数扩展过来;在windows下标准库被编译成了msvcr120.dll(msvcr100.dll,这里指release版),所以并不是扩展到代码中,而是在调用时动态链接;
而题主在其中自定义文件中实现了该函数,所以编译时找到了该函数的实现,并不会去链接dll(这应该是编译器做的一些工作,确定系统的dll需要加载哪些),所以题主的程序执行时就只有一份fputc了,并不冲突。
题主可以通过快捷键跳转声明就知道了,VS下,点选fputc实现函数按F12跳转到声明,指向的是stdio.h,再按一次跳转到你自己的定义了。Qt的话使用F2。
大概就是这样子了,可追问。
首先我们弄清楚一件事,函数声明可以放在任何头文件,实现可以放在任何实现该函数的源文件中,那么就存在一个问题:
编译时,到底优先去使用哪一个,为什么没有把标准库中的函数扩展过来;在windows下标准库被编译成了msvcr120.dll(msvcr100.dll,这里指release版),所以并不是扩展到代码中,而是在调用时动态链接;
而题主在其中自定义文件中实现了该函数,所以编译时找到了该函数的实现,并不会去链接dll(这应该是编译器做的一些工作,确定系统的dll需要加载哪些),所以题主的程序执行时就只有一份fputc了,并不冲突。
题主可以通过快捷键跳转声明就知道了,VS下,点选fputc实现函数按F12跳转到声明,指向的是stdio.h,再按一次跳转到你自己的定义了。Qt的话使用F2。
大概就是这样子了,可追问。
追问
那么我们是不是也可以将一些函数编译成.dll的形式,然后就可以将这些函数进行重写,或者说在源码中还要进行特别申明这些函数可以被重写?
追答
首先说明一点,这个实际上不应该叫重写。
我们也可以将自己写的函数编译成dll,然后另写一个同样的实现函数。
若你在程序中使用到该函数,编译时就会去寻找实现,而在你的源文件中有一份实现,你觉得编译器还会去寻找另外一份实现吗,而且对于动态库,编译时并不会去寻找实现,而是在如动态链接库.lib文件中知道该函数是动态连接及其内存地址。
如你要写与dll中重名的函数,不需要特别声明,只需像通常写函数一样
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询