2013-10-29 51 views
1

我希望這是一個有趣的問題。我試圖找到未解析的外部符號的來源。如果調試打開,我有調試代碼使用全局文件指針。所有這一切都調試代碼應該以#ifdef將被保護,如:尋找本應該被刪除的未解決的參考文獻

#ifdef DO_XLL_DEBUG 
fprintf(debugPointer, "hello\n); 
... 
#endif 

當我定義DO_XLL_DEBUG,一切都很好。如果我解壓DO_XLL_DEBUG,那麼所有的東西都會編譯(我會重建所有東西以防萬一),但是它在鏈接步驟失敗,找不到debugPointer。

所以,問題是,是否有一種簡單的方法可以找到我在調試代碼周圍#ifdef失敗的位置?我可以想到幾個不那麼簡單的方法。

我正在使用Visual Studio 2005.這是一個C++項目。

謝謝!

[編輯]

感謝您的所有建議。結果發現問題出在別人的代碼中,而這些代碼並不是我在Linux上開展工作的相應項目的一部分(我的大部分工作都是在這裏做的),所以難怪我沒有馬上找到它。

+0

你看着從鏈接器輸出的完整?我對VS工具鏈並不熟悉,但許多鏈接器會告訴你符號是從哪裏引用的。 –

+0

而不是混亂你的代碼與千#'ifdef's爲什麼你不只是'#ifdef'函數本身在發佈版本沒有什麼?這將是執行它的規範方式。無論如何,如果這是一個鏈接器錯誤,那麼它就是它無法找到的定義。 –

+0

@EdS。,調試輸出'printf'樣式由於可變參數個數不易變成宏函數。 –

回答

2

只需定義一些不兼容的debugPointer並讓編譯器指出您在所有意外使用或重新定義的位置。也許是這樣的:

#ifndef DO_XLL_DEBUG 
#define debugPointer static_assert(false,"damn it!"); 
#endif 

(因爲你沒有其他變量,參數等,這些被稱爲debugPointer

+0

這在Visual Studio中特別容易,因爲您可以將其添加到通常稱爲「stdafx.h」的預編譯頭文件中。 –

+0

太棒了!這正是我所尋找的東西。我過去做過這樣的事情,但顯然我患有腦凍結或什麼的。 –