2009-10-01 44 views
0

我正在尋找一個龐大的舊的C程序並將其轉換爲C++(我是新來的)。函數聲明和一個無法解析的外部程序

有很多複雜的預處理器黑客正在連接到這樣一個事實,即該程序必須在許多不同的平臺上以多種不同的配置運行。

在一個文件中(稱爲file1.c)我是致電functionA()
而在另一個文件中(稱爲file2.c)我有一個定義functionA()

不幸的是,函數的確切類型是由一系列以令人眼花繚亂的方式創建的宏指定的。

現在接頭抱怨並:

泛函是一個未解決的外部符號。

我懷疑問題在於file1.c中的原型與file2.c中的函數的真正定義略有不同。

由於_cdeclfastcall之間以及有和沒有__forceinline之間的不匹配,存在很大的細微差異範圍。

是否有某種方式來顯示究竟什麼編譯器認爲是所看到file1.c,而不是file2.cfunctionA()類型?

回答

1

您可以將一個標誌傳遞給編譯器(我認爲是/ P),它會導致它輸出傳遞給編譯器的完整的預處理輸出 - 然後可以打開這個(巨大)文件並搜索它並您需要的信息將在某處。

+0

+1。謝謝......這雖然有所幫助,但現在已經揭示了我在一個新問題中提出的更深奧的奧祕。 – Mick 2009-10-01 09:59:23

1

你真的必須將所有現有的C代碼轉換爲C++嗎?這可能是很多工作,尤其是考慮到你迄今爲止描述的內容。您可以使用C++編寫新代碼並使用extern "C"調用C代碼。例如,在C++源文件,您可以:

extern "C" { 
#include "old_c_header.h" 
} 

這改變了聯動所以C++編譯器沒有名稱重整生成的C代碼外部引用,使鏈接到的一切相匹配。

+0

不幸的是,我必須將它轉換爲C++,原因很多,但是無論如何感謝提示。 – Mick 2009-10-01 08:38:54

0

通常情況下,您應該在輸出中具有預期簽名和實際簽名。

否則,您可以指示編譯器將預處理結果輸出到單獨的文件中,cl.exe /p用於MSVC和gcc gcc -E

+0

鏈接器報告它無法找到的函數的精確聲明,大概是與file1.c對應的函數,但我不知道與file2.c對應的函數。 – Mick 2009-10-01 08:44:15

+0

太糟糕了,我希望預處理器輸出和grep /搜索函數名稱有所幫助。 – 2009-10-01 08:48:51

相關問題