博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C语言一个文件中的函数能直接调用另外一个文件中的静态函数吗? (某公司校园招聘面试试题)
阅读量:4140 次
发布时间:2019-05-25

本文共 710 字,大约阅读时间需要 2 分钟。

        我当时是这么答的: 不能直接调用。

        面试官问: 为什么?那有别的办法调用吗?

        我:......

        下面,我们来简要探讨一下。 显然不能直接调用, 但为什么呢? 因为main.c文件没法获取test.c文件中print函数的地址, 找到不到地址, 当然无从调用起。那么如果获取到了print的地址呢? 我们来看看:

main.c

#include 
#include "test.h"typedef void (*PFUN)();int main(){ int addr = getAddr(); ((PFUN)addr)(); return 0;}
test.c

#include 
#include "test.h"static void print(){ printf("hello\n");}int getAddr(){ return (int)print;}
test.h

static void print();int getAddr();
     结果ok.

      当然, 还有更简单的方法, 直接在test.c中定义另外一个非静态函数func, 然后这个函数调用静态的print, 而main.c中的main又来调用func.   要说明的是, 在实际的开发中, 函数前面的static本来就是要限制被文件外的函数调用, 所以上述面试中的需求并不常见, 但是, 作为面试题, 还是可以问问的。

     一句话: static函数的函数名(地址)在其他文件中是不可见的, 无法直接调用。但是, 有歪门邪道的方法来调用:让文件中的其他函数来暴露(出卖)这个地址。

     原来, 最坚强的堡垒总是从内部攻破的。

转载地址:http://dlrvi.baihongyu.com/

你可能感兴趣的文章
网站用户登录系统设计——jsGen实现版
查看>>
第三方SDK:讯飞语音听写
查看>>
第三方SDK:JPush SDK Eclipse
查看>>
第三方开源库:imageLoader的使用
查看>>
自定义控件:飞入飞出的效果
查看>>
自定义控件:动态获取控件的高
查看>>
第三方开源库:nineoldandroid:ValueAnimator 动态设置textview的高
查看>>
第三方SDK:百度地图SDK的使用
查看>>
Android studio_迁移Eclipse项目到Android studio
查看>>
JavaScript setTimeout() clearTimeout() 方法
查看>>
CSS border 属性及用border画各种图形
查看>>
转载知乎-前端汇总资源
查看>>
JavaScript substr() 方法
查看>>
JavaScript slice() 方法
查看>>
JavaScript substring() 方法
查看>>
HTML 5 新的表单元素 datalist keygen output
查看>>
(转载)正确理解cookie和session机制原理
查看>>
jQuery ajax - ajax() 方法
查看>>
将有序数组转换为平衡二叉搜索树
查看>>
最长递增子序列
查看>>