我当时是这么答的: 不能直接调用。
面试官问: 为什么?那有别的办法调用吗?
我:......
下面,我们来简要探讨一下。 显然不能直接调用, 但为什么呢? 因为main.c文件没法获取test.c文件中print函数的地址, 找到不到地址, 当然无从调用起。那么如果获取到了print的地址呢? 我们来看看:
main.c
#include <stdio.h>
#include "test.h"
typedef void (*PFUN)();
int main()
{
int addr = getAddr();
((PFUN)addr)();
return 0;
}
test.c
#include <stdio.h>
#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函数的函数名(地址)在其他文件中是不可见的, 无法直接调用。但是, 有歪门邪道的方法来调用:让文件中的其他函数来暴露(出卖)这个地址。
原来, 最坚强的堡垒总是从内部攻破的。