2009-09-07 24 views
13

我的(非託管)C++代碼中有一個非常複雜的宏。有什麼方法可以在VS調試器中擴展宏?或者也許有另一種方法來調試宏?如何在VS中有效地調試宏?

F.e.我想在它內部放置一個斷點。

(是的,我知道宏是不好的。)

回答

16

轉到通過右鍵點擊並進入「屬性」無論是項目或源文件的屬性。在配置屬性 - > C/C++ - >預處理器下,將「生成預處理文件」設置爲帶有或者不帶有行號,無論你喜歡什麼。這將顯示您的宏在上下文中展開的內容。如果您需要在實時編譯的代碼上進行調試,只需將其剪切並粘貼,並在調試時將其放入宏中。

+0

我說宏是非常複雜的嗎?我想只擴展一個或兩個層,不是所有的宏(否則它顯然是不可讀的)......在調試時。 – liori 2009-09-07 21:35:44

+2

是的,這很糟糕,但是我沒有找到解決方案。在做這件事時,我通常不得不自己繞過一下自己,或者手動替換代碼來獲取我想要的圖層,或者通過完全預處理的文件去做整個事情。 – 2009-09-07 22:18:26

+0

@JimBuck我似乎無法在Visual Studio 2013中找到'生成預處理文件'。 – sami1592 2016-09-08 10:23:50

4

編譯器很好地擴展宏。 獲取擴展的宏的編譯列表。

將展開的宏插入到您的代碼中。 重新編譯,你應該可以通過它, 做一個簡單的測試。

通常當我構建一個複雜的宏時,我先硬編碼並測試它。 然後我把它變成一個宏。

2008年,this可能會有所幫助

+0

我真的找不到如何自動擴展宏。我知道我可以手工完成,但我希望IDE可以做到這一點......就像GDB的擴展命令一樣。 – liori 2009-09-07 16:54:03

+0

您可以在源文件上運行C預處理器以擴展所有宏。 – n0rd 2009-09-08 12:06:25

+0

分別運行預處理器時,請注意它可能對預定義宏/常量(特別是平臺/編譯器版本特定的宏)有不同的想法。我被這個咬了! – 2009-09-16 12:17:41

0

用邪惡的方法反擊邪惡。手工擴展宏的一個實例,直到完成調試,或cpp實用程序可以幫助您擴展所有宏,但我不確定是否有Windows版本。

0

我說宏是非常複雜的嗎?我想擴大一層或兩層而已,並不是所有的宏(否則它顯然是不可讀)...在調試

如果沒有太多的宏,你想擴大,那麼你可以在你想調試的代碼片段之前簡單地#undef它們。然後用上面提到的[Generate Preprocessed File]編譯。編譯將會失敗,但是您可以在預處理輸出中使用正確的擴展來剪切。複製粘貼,刪除#undef -s並調試。

可悲的是,用於處理C風格的宏你最好的朋友是直列模板和良好的優化編譯器。

+0

我想挖掘現有的代碼,而不是重寫它。所以內聯和模板不會幫助我。 – liori 2009-09-16 21:53:59

0

使用內聯函數(強制內聯,如果你真的想要它)並堅持下去!這將更有效率(如果爲perf優化而帶來性能,則只能內聯)並且可維護。通過使用宏可以大大降低安全性:類型檢查&安全性。

編譯器不存在宏,它們只對預處理器執行。這一個不用尋找副作用就可以進行文本替換。所以宏實際上從來沒有被調用,你不能調試它們。不管你如何編寫一個宏,濫用總是可能的。就像這個例子:

#define SQUARE(a) ((a)*(a)) 

注意已經(`)',以防止像SQUARE(3 + 2)的替代品。但他們並沒有防範:

int a = 1; 
int b = SQUARE(++a); 

人們可能會認爲它是4,但你最終得到6是不是真正的方形。當它擴展到int b = (++a)*(++a);你不會有內置函數的這個麻煩。

請注意,內聯函數的實現必須在您使用它的地方對編譯器可見。對新手用戶來說,調試也會很奇怪:因爲有許多內聯函數的實例,例如,如果您想將執行點移動到另一個地方,您將獲得大量方法列表。

+2

我很瞭解宏的壞的和好的一面。 -1 – liori 2009-09-17 15:45:16

0

是的,你可以。

定位在調試夾由預處理器產生的預處理文件

所以,如果您的宏寫在testing.c文件,處理後的文件將被稱爲testing.i

在那裏,你可以看到宏已經擴大。

調試它,只需複製如果你想看到由預處理器生成的擴展代碼粘貼此代碼到你的:)

2

那麼你可以使用使用gcc -E標誌得到它。該命令會是這樣:

$ gcc -E <source code> -o <preprocessed file name> 

可以使用宏與要放置在那裏的擴展代碼和地點的任何破發點替換原來的源代碼。

+1

我知道,那是我當時正在做的。但是微軟編譯器的預處理略有不同 - 舉一個例子,請參閱http://social.msdn.microsoft.com/Forums/en-US/23f682bf-8421-474a-aa38-e32f9a0b728f/difference-between-microsoft-visual-studio -preprocessor和 - GCCS;另外,我真的不想使用額外的工具,將它們引入整個團隊是一件難事。 – liori 2013-12-14 10:25:28

3

我從http://www.codeproject.com/Tips/320721/Macro-expansion-in-VCplusplus中瞭解到調試宏的最好方法。

而我要做的就是創建一個名爲「test.cxx」我在內心裏只把宏CXX文件和一些應用實例一test.cxx的:

#define GetMacro(param1) \ 
    public: void Get##param1(){ return m_##param1; } 

GetMacro(MyVariable); 

,並在命令行我進入:

c:\ cl /EP test.cxx > output.cxx 

當我打開output.cxx文件應該有一些空行和底部的擴展的宏,如:

public: void GetMyVariable(){ return m_MyVariable; }; 

您可以在不編譯的情況下測試宏並使其更快。

3

我聽到主題的所有可能的否定回答:

  • 宏只能擴大不能評估
  • 預處理還應解析包含文件
  • 嵌套宏可能被過度複雜
  • 條件預處理可能會很棘手
  • 宏是邪惡只是避免它們
  • 等等等等....

他們都是真實的,但他們與IMO每天編程的現實相沖突。

事實上,在舊C工程中,宏在這裏大多隻是作爲函數使用,這對我來說非常重要。使用/ P生成所有預處理文件的工作原理,但過於耗時且耗時。我只需要一個工具來擴展在其他文件中定義的幾行或最多一行的簡單宏。

如何做到這一點?

  1. 在Linux上簡單地使用GDB和他展開宏功能
  2. 在Windows下我用https://www.jetbrains.com/resharper-cpp/集成 到Visual Studio

所以,是的,在實際意義上,它是可能的。

0

如果您使用Visual Studio來處理使用宏的C或C++項目,請獲取Resharper for C++(我相信有一個試用版)。它允許你點擊一個宏並完全或者分階段地擴展它。我們有一些非常複雜的嵌套宏,它是理解它們的唯一方法。