有没有支持C预处理器的Java集成开发环境(IDE)?

3

我想找一个Java IDE,或者任何一种配置流行的代码编辑器的方法,能够理解Java代码中的纯C预处理器(例如,'#if'但不是像' //#if'那样的athenna注释预处理器),类似于以下内容:

class Person
{
#if USE_SHORT_ID
  short m_Id;
#elif
  int m_Id;
#endif
#define DEFAULT_ID 0
#include "some_functions.h"

}

原因:我参与了一个Java项目,在Java代码中定义了C的宏和常量,然后在编译Java代码之前运行预处理器。 这些代码不断增长,范围变得混乱:类、成员和函数名太多,而且没有代码自动完成功能。


2
这听起来像是一场彻底的噩梦。你有没有可能在整个代码库上标准化一组标志,然后只需运行 cpp 呢? - nneonneo
你可不可以不使用像 Freemarker 这样的模板引擎?而是使用一个 Maven Mojo 来对代码进行预处理? - munyengm
2
针对这种情况,为什么不直接使用整数呢?除了内存使用上的微小优势外,我并没有看到使用短整型的任何真正优点。我认为你应该评估一下是否真的需要使用预处理器,或者之前的程序员只是过于热衷于使用它们。 - Lie Ryan
我的意思不是关于short或int,而是关于Java中的C预处理器。 - tiboo
1
NetBeans支持//#if预处理器,将代码修改为使用它们将是一个简单的修改。 - Denis Tulskiy
1个回答

1

这看起来像是那种“当时看起来是个好主意”的事情...

如果所有宏的用途都像你复制的那个,也许你可以尝试以下做法:

types.hj: (Java头文件通常使用什么扩展名?!)

#if USE_SHORT_ID
    #define short id_t
#elif
    #define int id_t
#endif

然后在 *.java 文件中,你只需要这样做:

class Person
{
    id_t m_Id;
}

然后,当您调用预处理器时,您会强制包含types.hj文件。例如,使用GNU cpp:

$ cpp -include types.hj PersonP.java -o Person.java

这应该足以不禁用您的IDE自动完成功能。

如果有其他更有创意的宏的用途...那可能行不通。


“Java头文件的通常扩展名是什么?!” - 为什么对于通常不存在的东西会有一个“通常的扩展名”呢? - Michael Burr
@MichaelBurr:哦,我应该加上_[讽刺]_或者什么的,因为AFAIK没有表情符号... - rodrigo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接