试图以相反的顺序使用extern

Trying to use extern in reverse order

本文关键字:顺序 extern      更新时间:2023-10-16

当我们有一个exedll和一个static library附着在它上面时,我们可以使用extern关键字从exedll访问静态库的variables和/或functions。为了使事情更简单,让我们假设我们有一个exe和一个lib连接到它。

我想做的是从lib调用exe的函数。

可执行代码
void doSomething() {
    // do something here
}
静态链接库代码
void onSomeEvent() {
    doSomething(); // call doSomething() here
}

反之亦然很容易,但我想知道这是否可以像extern关键字一样完成。或者最好的方法是什么?

我想到的是将function pointer(如void*)传递给lib中的functions/methods之一(可能是类构造函数)。我认为这应该工作,但我不想触摸库的代码太多,因为库不是我的,可以用更新的版本替换。我可以添加/删除几行代码,但我想防止改变函数接口。

更好的方式是什么?

您也可以在函数外声明它,您可能有其他函数需要它。

void doSomething(); // declares the function
void onSomeEvent() 
{
    doSomething(); // call doSomething() here
}
void onSomeEvent2() 
{
    doSomething(); // call doSomething() here
}

当然,您只需要在库中声明函数。

void onSomeEvent() {
    void doSomething(); // declares the function
    doSomething(); // call doSomething() here
}

给定静态库(可能)意味着在许多不同的程序中使用,使用回调方法并不罕见,其中exe初始化库并将其传递一个或多个函数指针用于做事情(如日志消息,或其他)。如果exe不传递函数指针(或将它们作为NULL传递),则库可以简单地不调用这些函数,并且库将在两个环境中正常工作。

这比假设函数总是在exe中定义要好得多。