2012-04-11 35 views
2

我在外部庫中調用了在版本1和版本2之間添加參數的函數。我想支持這兩個版本。在編譯時選擇/發現extern函數調用的簽名

在這一點上我做

extern void run(int param1); 

... in the code ... 
run(123); 

在它的運行版本2(INT參數1,INT參數2)。

我可以檢測我以某種方式動態鏈接的庫的版本嗎? (參數數量)

我想避免讓用戶在Makefile中設置庫版本,並用預處理器-ifs解決這個問題。

+0

它是什麼庫?如果圖書館的開發人員有前瞻性的想法,那麼圖書館用戶可以獲得圖書館版本。可能是一個函數或全局變量。沒有這樣的版本可讀性,更改庫API的調用簽名就是邪惡的。 – TJD 2012-04-11 21:14:39

+0

不幸的是,雖然我猜我可以在運行make時從庫目錄的README中抓取/ grep它。 – j13r 2012-04-11 21:16:07

回答

0

C代碼的工作方式是v1函數只能訪問第一個傳遞的參數。只要該參數對兩個版本具有相同的含義,就可以安全地將這兩個參數傳遞給提供的任何功能。 v1只會看到第一個; v2將會看到兩個參數。

這種權力來自C的架構需要,以支持可變數量的參數,例如printf()。調用代碼在調用完成後刪除參數,並且參數從右向左推,以使第一個(最左邊的)參數始終位於堆棧幀的頂部。

只有當庫的API被惡意升級時,第一個參數纔會有不同的含義。

+0

假設這個函數是在頭文件中聲明的,編譯器將不接受這個代碼。即使它確實(或沒有聲明),標準中的任何內容都不能保證它能起作用。 (編譯器可以爲variardic函數實現不同的調用轉換) – asaelr 2012-04-12 00:41:06

相關問題