本文共 710 字,大约阅读时间需要 2 分钟。
我当时是这么答的: 不能直接调用。
面试官问: 为什么?那有别的办法调用吗?
我:......
下面,我们来简要探讨一下。 显然不能直接调用, 但为什么呢? 因为main.c文件没法获取test.c文件中print函数的地址, 找到不到地址, 当然无从调用起。那么如果获取到了print的地址呢? 我们来看看:
main.c
#includetest.c#include "test.h"typedef void (*PFUN)();int main(){ int addr = getAddr(); ((PFUN)addr)(); return 0;}
#includetest.h#include "test.h"static void print(){ printf("hello\n");}int getAddr(){ return (int)print;}
static void print();int getAddr();结果ok.
当然, 还有更简单的方法, 直接在test.c中定义另外一个非静态函数func, 然后这个函数调用静态的print, 而main.c中的main又来调用func. 要说明的是, 在实际的开发中, 函数前面的static本来就是要限制被文件外的函数调用, 所以上述面试中的需求并不常见, 但是, 作为面试题, 还是可以问问的。
一句话: static函数的函数名(地址)在其他文件中是不可见的, 无法直接调用。但是, 有歪门邪道的方法来调用:让文件中的其他函数来暴露(出卖)这个地址。
原来, 最坚强的堡垒总是从内部攻破的。
转载地址:http://dlrvi.baihongyu.com/