您不能也不应该直接从库中调用程序中的函数。请记住使库成为库的关键方面:
库不依赖于特定的应用程序。一个库可以在不存在程序的情况下完全编译并打包到 .a 文件中。
所以有一种单向依赖,一个程序依赖于一个库。乍一看,这似乎会阻止你实现你想要的。您可以通过有时称为回调的方式来实现您所询问的功能。主程序将在运行时向库提供一个指向要执行的函数的指针。
// in program somwehere
int myDelegate(int a, int b);
// you set this to the library
setDelegate( myDelegate );
如果您查看中断处理程序的安装方式,您会在 arduino 中看到这一点。同样的概念存在于许多环境中——事件侦听器、动作适配器——所有这些都具有相同的目标,即允许程序定义库无法知道的特定动作。
该库将通过函数指针存储和调用函数。这是一个粗略的草图:
// in the main program
int someAction(int t1, int t2) {
return 1;
}
/* in library
this is the delegate function pointer
a function that takes two int's and returns an int */
int (*fpAction)(int, int) = 0;
/* in library
this is how an application registers its action */
void setDelegate( int (*fp)(int,int) ) {
fpAction = fp;
}
/* in libary
this is how the library can safely execute the action */
int doAction(int t1, int t2) {
int r;
if( 0 != fpAction ) {
r = (*fpAction)(t1,t2);
}
else {
// some error or default action here
r = 0;
}
return r;
}
/* in program
The main program installs its delegate, likely in setup() */
void setup () {
...
setDelegate(someAction);
...