在Java代码上运行GCC预编译器

时间:2009-10-25 19:01:27

标签: java gcc

我正在尝试通过发出以下命令在Java代码上运行GCC预编译器:“gcc -D YES -E -x c -o YesNo.java _YesNo.java”。 gcc预编译器在文件的开头添加了一些额外的东西/信息,如下所示。如何指示预编译器不要创建这样的输出,以便我可以直接编译预编译器的输出而不进行任何修改?提前谢谢!

GCC的Java输入:

 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");



    }
 }

3 个答案:

答案 0 :(得分:4)

您只需要-P arg。

您可能还想运行cpp命令,而不是gcc

最后,请注意来自man cpp的以下FSF警告:

  

C预处理器的目的是   仅用于C,C ++和Objective-C   源代码。在过去,它一直是   滥用作为一般文本处理器。   它会扼杀没有的输入   遵守C的词汇规则。例如,   撇号将被解释为   字符常量的开头,和   导致错误。此外,你不能依赖   它保留了特征   输入并不重要   C系列语言。如果是Makefile   预处理,所有硬标签都会   被删除,Makefile不会   工作

     

话虽如此,你经常可以得到   远离使用cpp的东西   不是C.其他Algol-ish   编程语言通常是安全的   (Pascal,Ada等)所以是集会,   慎用。 -traditional-cpp模式   保留更多的空白,是   否则更宽容。很多人   写C可以避免问题   或C ++风格的评论而不是   母语评论和保持   宏简单。

     

只要有可能,你应该使用   适合该语言的预处理器   你正在写作。现代版本   GNU汇编程序有宏   设备。最高级别   编程语言有自己的   条件编制和包容   机制。如果一切都失败了,试试吧   真正的通用文本处理器,如   GNU M4。

请注意m4(1)的引用。我怀疑cpp可以在Java上正常工作,但如果它不只是使用m4

答案 1 :(得分:1)

预处理(在我看来)会使代码变脆。

而是考虑aspectj或注​​释。

答案 2 :(得分:0)

-Wp,-P添加到您的gcc调用中。 -Wp,将参数传递给预处理器cpp-P在传递给cpp时禁止生成线标记。