2011-11-21 18 views
3

當我們有一個exedll並連接到它static library,我們能夠使用extern關鍵字來訪問靜態庫的從exedllvariables和/或functions。爲了簡單起見,我們假設有一個exe和一個lib附加到它。嘗試使用的extern以相反的順序

我想要做的是從lib調用exe的函數。

可執行代碼

void doSomething() { 
    // do something here 
} 

靜態鏈接庫代碼

void onSomeEvent() { 
    doSomething(); // call doSomething() here 
} 

反之則是容易的,但我不知道這是否可以像extern關鍵字的方式來完成。或者什麼是最好的方法?

什麼在我腦海中是通過一個function pointer(如void*)到functions/methods之一,在lib(可能是一類的構造函數)。我認爲這應該可行,但我不想過多地觸及庫的代碼,因爲庫不是我的,可以用新版本替換。我可以添加/刪除幾行代碼,但是我想阻止更改函數接口。

什麼是更好方式?

+0

這是高度平臺特定的。你使用什麼編譯器/工具鏈? – sehe

回答

2

當然,你只需要在庫中聲明函數。

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

奇怪地工作得很好。 :)我知道什麼是原型,但我只是遇到了像這樣的用法。非常感謝老兄。 –

1

考慮了靜態庫(可能)意味着許多不同的程序中使用,它的情況並不少見使用其中的exe初始化庫,並將它傳遞一個或多個函數指針用來做回調方法事情(如日誌消息,或其他)。如果exe文件沒有傳入函數指針(或者將它們傳遞爲NULL),那麼函數庫可以不調用這些函數,並且庫在兩種環境中都可以正常工作。

這是好於假設函數總是在exe中定義。

+0

感謝您的評論,但在我的情況下,avakar的答案正是我所期待的。儘管你對你的觀點是正確的。 –

4

你也可以在你的函數之外聲明它,你可能有其他函數需要它。

void doSomething(); // declares the function 

void onSomeEvent() 
{ 
    doSomething(); // call doSomething() here 
} 

void onSomeEvent2() 
{ 
    doSomething(); // call doSomething() here 
}