2012-05-29 68 views
8

如何將c99源代碼自動轉換爲c89?我想用Visual C++編譯c99庫,但MSVC只支持c89。許多更改只是語法上的,比如結構初始化器,並且您可以編寫一個工具來自動「去除c99」代碼。這個預處理器是否存在?將C99代碼轉換爲C89

+1

,我相信創造C99正是爲了避免這樣的「預處理器」 :)對於「未來」的原因(是的,雙關語意) - 如果您使用舊工具,請避免使用現代功能。 –

+1

如果將它編譯爲C++,那麼它的工作量就會減少... –

+2

您可以使用現代的第三方編譯器,如可插入Visual Studio的Intel ICC。 –

回答

1

你需要的是一個program transformation system。這樣的工具讀取源代碼,構建編譯器的數據結構(如abstract syntax trees,使你可以應用(源到源)上的結構轉換,然後可以從修改後的數據結構的再生源。

你需要一個它可以解析C99,並轉換爲C89。我們的DMS Software Reengineering Toolkit可以使用它的C Front End(它可以處理C的兩種方言,包括MSVC 89以及ObjectiveC)。如果你想要這樣做,需要一個成熟的解析器

許多人可能會建議你需要的是全部是一個C99解析器,實際上,這是不正確的;在典型的計算機語言上做任何有趣的轉換您需要符號表數據,某些數據流等。有關更多詳細信息,請參閱我在Life After Parsing上的散文,以及DMS如何提供這種生活。

一個這樣的方面是你如何編碼替換結構初始值設定項。您可以通過自定義代碼來執行此操作,這些代碼遍歷C99 AST,找到這樣的結構初始化程序,然後程序性地破解該樹。是的,這是有效的,但這並不容易,你必須知道關於樹結構的大量數據。 DMS提供源到源重寫,因此您可以編寫識別要修改的習慣用法的模式,以及生成所產生的習慣用法的模式,全部使用C語言語法。

3

商業Comeau C/C++ compiler可以做到這一點。

或者,使用合適的C編譯器(例如,通過MinGW,Pelles C,Intel的GCC或Clang)並鏈接生成的目標文件。但是,並非所有這些(特別是MinGW)都支持微軟的調試格式。