2008-11-10 32 views
185

假設我有一個包含許多預處理指令的源文件。在預處理器完成之後可以看到它的外觀嗎?如何在Visual Studio中預處理後看到C/C++源文件?

+0

如果您提供了更多信息,例如您正在使用哪種編譯器,這將有所幫助。 – JaredPar 2008-11-10 07:14:15

+0

我目前使用Visual Studio 2005作爲我的IDE。 – Geo 2008-11-10 07:16:01

+0

然後默認情況下你正在使用cl.exe編譯器。 – 2008-11-10 15:37:40

回答

119

大多數編譯器都有一個選項來運行預處理器。 例如,GCC提供-E:

-E Stop after the preprocessing stage; do not run the compiler proper. 
     The output is in the form of preprocessed source code, which is sent 
     to the standard output. 

所以,你可以運行:

gcc -E foo.c 

如果你不能找到這樣的選項,你也可以隨便找你的機器上的C預處理。它通常稱爲cpp,可能已經在您的路徑中。調用它是這樣的:

cpp foo.c 

如果有用戶需要從其它目錄,包括標題,您可以通過-I /路徑/到/包括/目錄到其中任意一個,就像你有定期編譯。

對於Windows,我將其留給其他海報來提供答案,因爲我不是那裏的專家。

+0

gcc問題:http:// stackoverflow。在VS2010中的「預處理到文件」是如何運行的 - gcc-pre-processor-to-see-how-the-source-look-after-defined-are-e – 2016-01-17 11:44:45

6

在Visual Studio中,您可以使用/ P編譯文件(或項目)。

8

如果您使用的是Microsoft的C++編譯器,請嘗試cl /EP

89

右鍵單擊解決方案資源管理器上的文件,轉到屬性。在配置屬性 - > C/C++ - >預處理器中,「生成預處理文件」就是您要查找的內容。然後右鍵單擊解決方案資源管理器中的文件並選擇「編譯」。預處理文件在輸出目錄(例如Release,Debug)中創建,擴展名爲.i(感謝Steed的評論)。

+9

。 – 2013-11-01 09:31:41

18

您通常需要對預處理器的輸出執行一些後處理,否則所有宏都會擴展爲一行,這很難讀取和調試。對於C代碼,類似以下內容就足夠了:

gcc -E code.c | sed '/^\#/d' | indent -st -i2 > code-x.c 

對於C++代碼來說,它實際上要困難得多。對於GCC/g ++,我發現this Perl script有用。

5

正如bk1e和Andreas M.回答的那樣,編譯器的/ P選項將導致它對文件進行預處理。但是,在使用VS2005和Platform Builder(對於嵌入式ARM處理器)的項目中,該項目沒有在對話框中顯示一個選項(如Jim B所述)來啓用該選項。

我可以手動運行CL並添加/ P,但它失敗了,因爲我不知道在完整構建過程中無法被平臺生成器激活的所有適當的命令行選項。所以我需要知道所有這些選項。

我的解決辦法是去看看在build.log文件,發現執行

CL blah-blah-blah myfile.c

我複製這條線到剪貼板上線。 「blah-blah-blah」部分包含構建選項,並且非常龐大。

回到IDE中,我右鍵單擊myfile.c,選擇「打開構建窗口」,然後在該窗口中粘貼構建命令行並添加「/ P」。

CL /P blah-blah-blah myfile.c

完成。生成了myfile.i文件,其中包含預處理器輸出。

8

我不知道微軟編譯器的東西,但在GCC您可以使用此:

gcc -E -P -o result.c my_file.h 

如果你想看到的評論使用:

gcc -E -C -P -o result.c my_file.h 

更多選項上this page avaliable 。

2

CPIP是一個用Python編寫的新的C/C++預處理程序。如果你想要一個預處理文件的詳細視覺表示,請給它一個鏡頭。

CPIP是一個用Python實現的C/C++預處理器。大多數預處理器將預處理視爲一項骯髒的工作,只需儘快完成即可。這可能會使得很難在預處理階段追蹤細微的缺陷,因爲預處理器會丟棄大量有用的信息,以便儘可能便宜地獲得結果。

很少有開發人員真正理解預處理,對很多人來說這是一個晦澀難懂的黑魔法。 CPIP旨在改進這一點,並記錄預處理的每個細節,以便CPIP可以生成一些關於文件依賴性,宏使用情況等的可視化信息。

CPIP的設計不是取代cpp(或任何其他已建立的預處理器),而是CPIP將清晰度和理解視爲比處理速度更重要。

2

在Windows操作系統,簡單的一行回答這個問題是用在DOS下面的命令提示符下看到處理後的文件:

CL /P /C myprogram.c 

這將生成一個名爲myprogram.i。打開它並查找擴展的預處理器。

相關問題