我正在尝试通过发出以下命令在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");
}
}
答案 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
时禁止生成线标记。