一般而言,我偶爾會在其定義中有一些嵌套宏和一些預處理器條件元素。由於很難直接看到正在執行的代碼,因此調試可能會很痛苦。有沒有一個很好的調試C++宏的通用方法?
前一段時間我依稀記得找到一個編譯器(gcc)標誌來擴展它們,但是我在實踐中遇到了麻煩。
一般而言,我偶爾會在其定義中有一些嵌套宏和一些預處理器條件元素。由於很難直接看到正在執行的代碼,因此調試可能會很痛苦。有沒有一個很好的調試C++宏的通用方法?
前一段時間我依稀記得找到一個編譯器(gcc)標誌來擴展它們,但是我在實踐中遇到了麻煩。
gcc -E將輸出預處理源到stdout。
用加載的符號調試dissasembly。
對於MSVC用戶,您可以右鍵單擊文件/項目,查看設置並更改文件屬性以輸出預處理源(通常位於obj目錄中)。
Upvote for tip,但我必須說,每個處理過的文件比通過自己宏(特別是如果一個宏跨越多行)更糟糕。由於某種原因,成千上萬行的行數很多,大量的空行填滿了文檔的大部分內容。 – Samaursa 2011-11-03 17:55:07
這可能不適用於您的情況,但宏確實妨礙調試並且經常被過度使用和避免。
你可以使用內聯函數替換它們嗎?否則可以一起去掉它們?
謝謝;好建議。我並不是因爲某種特定的情況而要求,而是因爲我過去遇到過這樣的麻煩,並且預計未來會有更多的麻煩。我維護的大部分代碼(大部分都不是由我編寫的)廣泛使用宏,所以它能夠調試它們仍然很有用。 – Tyler 2008-09-20 01:14:33
您可能應該開始移走宏並開始使用內聯和模板。
宏是一個古老的工具,有時是正確的工具。作爲最後的手段記得printf是你的朋友(當你做多線程的東西時,實際上printf並不是那麼糟糕的朋友)
GCC和兼容編譯器使用-E選項將預處理源輸出到標準輸出。
gcc -E foo.cpp
的Sun Studio也支持這一標誌:
CC -E foo.cpp
但更好的是-xdumpmacros。你可以找到更多信息in Suns' docs.
的gcc -save-臨時工 會寫出來(對於C++或文件。②)一個。我這是C預處理器的輸出,然後纔會慢慢交給編譯器。這通常是有啓發性的。
基於內容獲得gcc授權 – 2008-09-20 00:24:41