2011-03-19 64 views
0

我正在編寫一個解析器,它對C/C++源文件進行操作。作爲解析器的第一階段,我需要使用一些已經可用的預處理器,這樣我就可以脫離諸如#define, #ifdef之類的指令。 對於g ++,可用的工具是'cpp'(或g++ -E ...)。我有2個問題:如何使用包含路徑的cpp(c預處理器)

  1. 我分析器用C++編寫,所以這可能是運行在其他C/C++源文件,這個「CPP」的最佳方式?是這樣的:

    system("cpp sourceFile.cpp parsed_sourceFile.cpp"); // just a pseudo code 
    

    還有沒有更好的方法?

    (我想知道,只有用它,我可以在指定的文件進行預處理的可能途徑。有喜歡system()這些命令,或popen()是做這樣的事標準的方式?)

  2. 我怎麼能走照顧源文件內的非標準包含文件?我不知道這些用戶定義的頭文件存儲在哪個地方。

+0

你是在Windows還是* nix? Win32 API有一些調用(如ShellExecute())。我相信*尼克斯有他們自己的,但我不知道他們是什麼。 – jonsca 2011-03-19 12:36:31

+0

不,我正在使用unix類型的平臺。爲什麼我與system()混淆是因爲,我在某處讀到系統(「PAUSE」)是一個糟糕且不可移植的命令。但是現在我認爲,它是特定於「暫停」而不是一般意義上的system()。 – iammilind 2011-03-20 16:15:46

+0

它不可移植,因爲我不相信所有系統都有「暫停」的通用性。在某些情況下,這也是一種安全風險,因爲如果某人用一個同名的流氓程序替換了系統的「暫停」,那麼您用系統編寫的每段代碼(「暫停」)都會變得危險。 – jonsca 2011-03-20 21:17:00

回答

0

系統是最可能的跨平臺方式。但是如果你的代碼是單一平臺,你可以通過使用平臺的本地API來更好地控制子程序的執行。像Windows中的ShellExecute一樣。

有很多地方可以找到非標準的包含文件,例如與源腳本位於相同的目錄中。這些目錄通常在項目的項目和MAK文件中提及。您可以打開這些文件並查找其中提到的額外包含位置。但更簡單的方法當然是向用戶自己詢問這些包含文件在哪裏。

+0

謝謝,我對系統()有些懷疑。現在很明顯。順便說一句,我想以通用的方式進行設計,所以system()是更好的方法。 – iammilind 2011-03-20 16:19:19