C++-关于在一个cpp中调用另一个cpp的文件的方法

C++-关于在一个cpp中调用另一个cpp的文件的方法

泛泛之交 发布于 2017-02-05 字数 284 浏览 1504 回复 3

如果A.cpp中定义了一个函数, 注意这里是static

static BOOL WINAPI AlphaBitBlt(HDC hDC, int nDestX, int nDestY, int dwWidth, int dwHeight, HDC hSrcDC, int nSrcX, int nSrcY, int wSrc, int hSrc, BLENDFUNCTION ftn);

如果你对这篇文章有疑问,欢迎到本站 社区 发帖提问或使用手Q扫描下方二维码加群参与讨论,获取更多帮助。

扫码加入群聊

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

归属感 2017-05-15 3 楼

你的需求是否合理暂且抛开,只谈实现。
其实要调用一个函数,只需要知道这个函数的地址就行,无论是在编译/链接阶段,或者是运行阶段都可以。所以....

//a.cpp
static int foo(int a, int b) {return a + b;};
int (*funptr)(int,int) = foo;

//b.cpp
extern int (*funptr)(int,int);
int main (){
funptr(1,2);
return 0;
}

使用函数指针,把函数地址传递出去不就可以了。

归属感 2017-03-19 2 楼

首先,声明为static就意味着只将该函数给这个模块自己使用,是因为编译之后,会生成一个可重定位的目标模块,该模块中有个符号表,用来存放符号,共分为3种的,其中static关键字限定的称为本地符号,也就是说只能由当前模块引用,并不对其他模块暴露,举个例子就好像C++里面将成员声明为private一样,不对外暴露。所以既然加上了static限定,就是不想对外暴露了,如果想用的话,可以采取两种方法
1、去掉static。不过不建议
2、自己在B中定义一个作用相同的函数,名字什么的都可以相同,因为是静态的,只给自己模块使用,其他模块不可见,所以不会发生冲突,直接粘贴过来即可,记得加上static关键字限定

甜柠檬 2017-02-06 1 楼

一般回答是不能。static的功能就是防止这个函数被从别的cpp里面调用。编译原理上来说,标识为static的函数在编译这个cpp的时候不会导出符号——只有导出了符号才能从其他cpp里面链接过来。static的作用是如果这个函数只有当前cpp用,定义之后其他cpp里仍然可以定义这个名字的函数,不会出现编译错误。这样就可以使用max之类的常见名。
可以把整个函数复制过来,或者直接放进头文件里面。