2013-12-13 67 views
1

有沒有辦法從GCC預處理器中檢索預定義的宏而不必使用臨時文件(例如使用管道)?從GCC獲取沒有臨時文件的預定義宏

StackOverflow中存在類似的問題,但其所有答案都使用命令行,而我需要從過程中讀取所提到的數據。 GCC dump preprocessor defines

谷歌基本上返回了很多問題的命令行版本的答案。

當我試圖執行在Windows上使用管道在Linux或NUL輸出定向到/ dev/null的命令行招:

RunAndGetOutput("cpp -dM -E < NUL"); 

...發生錯誤:

cpp.exe: error: <: Invalid argument

cpp.exe: warning: '-x c' last input file has no effect

cpp.exe: fatal error: no input files

compilation terminated.

當我從命令行執行相同的命令時,一切正常,並且定義了它的打印列表。

有什麼辦法可以解決這個問題嗎?

+0

這聽起來像你需要一個命名管道。查找CreateNamedPipe(Windows)或mkfifo(POSIX)。這樣你就可以得到一個特殊的文件名,你可以把它作爲輸出文件傳遞給GCC。令人討厭的位通常基於PID命名。 – doynax

+0

RunAndGetOutput不解釋shell元字符,所以gcc在命令行上看到一個'<',並且不知道這意味着什麼。 –

回答

1

我不知道完全知道如何NUL的行爲在Windows下,但我相信它是類似於/dev/null在Unix/Linux操作系統:/dev/null in Windows?

在我的Ubuntu VM我可以這樣做:

cpp -dM -E -xc /dev/null 

所以,我在windows下假設你可以這樣做:

cpp -dM -E -xc NUL 

這是假設NUL行爲基本上一個空文件。如果type NUL的輸出是這裏的任何指標,那麼這是希望的情況。

另外,如果這不起作用,你可以一個cmd.exe子shell中做重定向cpp命令:

cmd.exe /C "cpp -dM -E < NUL" 

從視圖的RunAndGetOutput()來看,這只是一個單一的cmd.exe命令與很少有參數通過,沒有管道/重定向。但cmd.exe外殼將解釋傳遞的字符串作爲命令,並且重要的是將瞭解如何正確處理重定向<


既然你直接調用cpp預處理,在-E-xc選項是多餘的(至少這是在Linux中的情況下),但使他們有不會做任何傷害。

+0

@nos - 是的,像往常一樣有不止一種方式來做事情。但要小心 - windows'echo'有點不同 - 如果單獨運行,它會打印出'ECHO is on.'。要真正迴應空白行,您需要執行'echo.'。所以'cmd.exe/C「回顯。| cpp -xc -dM -E - 「'應該這樣做。 –

+0

-xc標誌有效,謝謝! – Orwell