2009-10-25 37 views
0

我想通過發出以下命令在Java代碼上運行GCC預編譯器:「gcc -D YES -E -x c -o YesNo.java _YesNo.java」。不過,gcc預編譯器在文件的開頭添加了一些額外的東西/信息,如下所示。我如何指示預編譯器不創建這樣的輸出,以便我可以直接編譯預編譯器的輸出而不做任何修改?提前致謝!在Java代碼上運行GCC預編譯器

Java輸入到GCC:

public class YesNo 
{ 
    public static void main(String[] args) 
    { 
     #ifdef YES 
      System.out.println("YES"); 
     #else 
      System.out.println("NO"); 
     #endif 
    } 
} 

GCC預編譯器輸出:

# 1 "Slask.pjava" 
# 1 "<built-in>" 
# 1 "<command line>" 
# 1 "Slask.pjava" 

public class YesNo 
{ 
    public static void main(String[] args) 
    { 

      System.out.println("YES"); 



    } 
} 

回答

4

你只需要-P ARG。

您可能還想運行cpp命令,而不是gcc

最後,從man cpp注意以下FSF警告:

C預處理器旨在是僅與C,C++使用 ,和Objective-C 源代碼。在過去,它被 濫用爲一般的文本處理器。 它會窒息輸入不符合C的詞彙規則 。例如, 撇號將被解釋爲 字符常量的開頭,並且 會導致錯誤。另外,你不能依賴 它保留 輸入的特性,這對 C族語言不重要。如果一個Makefile是 預處理,所有硬標籤將被刪除,並且該Makefile將不會 工作。

說了這麼多,你往往能獲得 遠用的東西CPP其 不是C.其他大陵五十歲上下的 編程語言通常是安全的 (帕斯卡,阿達等),那麼,組裝, 與警告。傳統cpp模式 保留更多的空白區域,並且是 否則更寬容。許多 問題可以通過編寫C 或C++樣式註釋而不是 本地語言註釋,並保持 宏簡單。

只要有可能,你應該使用 預處理面向 您來信的語言。現代版本的GNU彙編 具有宏觀 設施。最高層次的 編程語言有自己的 條件編譯和包含 機制。如果一切都失敗了,請嘗試使用真正的通用文本處理器 ,例如 GNU M4。

請注意參考m4(1)。我懷疑cpp將在Java上正常工作,但如果它不僅僅使用m4

0

-Wp,-P添加到您的gcc調用中。-Wp,將自變量傳遞給預處理器cpp-P在傳遞到cpp時禁止生成線標記。

1

預處理將(在我看來)使代碼變得脆弱。

改爲考慮aspectj或注​​釋。

相關問題