C语言一个文件中的函数能直接调用另外一个文件中的静态函数吗? (某公司校园招聘面试试题)

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

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

        我:......


        下面,我们来简要探讨一下。 显然不能直接调用, 但为什么呢? 因为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函数的函数名(地址)在其他文件中是不可见的, 无法直接调用。但是, 有歪门邪道的方法来调用:让文件中的其他函数来暴露(出卖)这个地址。

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



  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值