如何让eclipse识别预处理器语句?

时间:2009-11-25 16:00:36

标签: java eclipse ide eclipse-plugin

我设法让IDE通过修改config.ini来正确编译java项目,但是IDE本身仍然显示有关处理器语句的错误:

//#ifdef VER_X
public class Video extends FirstCanvas {
//#else
public class Video extends SecondCanvas {
//#endif
...

是否有可以解决此问题的设置或插件?

编辑:也许有点澄清:我正在寻找一些能让IDE编辑器更符合代码的东西。它不会让我遵循任何定义,因为编辑器认为是错误。

3 个答案:

答案 0 :(得分:15)

在java中永远不需要(也不建议)使用预处理器。最好配置Subversion(或您最喜欢的源代码管理器)来引入每个应用程序独有的各种java文件的正确版本,并引用平台中立桥类(扩展通过subversion引入的正确平台类)直接从多个平台共享的全局类引用特定于平台的类。但是,有时需要使用java预处理器,因为它广泛用于预先存在的代码,这些代码正在被重新利用。 (例如,制作现有Blackberry应用程序的新Android版本。)如果您发现自己处于这种情况,那么这里是如何在Eclipse内部的Java代码中使用预处理器:

安装天线插件:

确保您已在Eclipse中保存的所有内容都已保存。

转到Eclipse顶部菜单中的“帮助”,然后单击“安装新软件...”选项。

点击“添加...”按钮。

将“Antenna”放入“Name:”编辑框,在“Location:”编辑框中输入“http://antenna.sf.net/update”,然后点击“确定”按钮。

扩展“Uncategorized”插件组,选中“Antenna eclipse插件”(版本1.1.8)的复选框,然后单击“下一步”按钮上的“单击”。

单击“完成”按钮。

如果弹出安全警告,请单击“确定”按钮。

确保关闭已运行的Eclipse的任何其他实例,然后单击“是”按钮以重新启动此Eclipse实例。

将项目标记为天线可处理:

如果需要,创建项目。

右键点击该项目。

如果弹出菜单旁边没有复选标记,则单击弹出菜单上四分之三左右的“Antenna Preprocessor”选项。

确保Antenna使用的device.xml文件位于正确的文件夹中。

这里是一个示例device.xml文件:

<?xml version="1.0" encoding="ISO-8859-1" standalone="yes" ?> 

<devices>
 <device supportsPolishGui="true">
  <capability name="android" value="true" />
  <capability name="sqlite" value="true" />
  <identifier>Android</identifier> 
  <features>isVirtual</features> 
  <groups>XT</groups> 
  </device>
</devices>

对于Android,这是'“project”/ resources',对于Blackberry,这是''project“/ res'。 (Android只需要“project”/ res文件夹中的Android特定文件。)

为项目设置天线:

单击选择项目。

转到Project-&gt; Properties-&gt; Antenna Preprocessor。

如果弹出警告,告诉您无法找到设备,请点击“确定”按钮。

单击“设备数据库的可选目录”的“清除”按钮。组合框如果不为空。 (即使已经显示正确的目录,也必须这样做。)

单击“浏览”按钮,然后选择device.xml所在的文件夹。 (对于Android,这是'“project”/ resources',对于Blackberry,这是''project“/ res'。)

如果“设备名称”组合框不为空,请单击“清除”按钮。 (即使正在显示正确的设备,也必须这样做。)

单击“搜索”按钮并选择设备。 (对于Android,这是'Android',对于Blackberry,这是'Black Berry'。)

单击“确定”按钮。

Antenna现在将通过项目中的所有文件和注释('// @')或取消注释预处理器命令所包含的代码(必须以'//#'开头),具体取决于device.xml中的设置文件。

注意:这可能会导致全局程序包中的java文件被标记为与Subversion不同步。如果其他人上传他们的更改,然后您通过Subversion从头部获得更改,这可能会导致Subversion出现问题。如果由于天线而将全局java文件标记为与Subversion不同步,那么通常最好立即为您计划稍后更改的任何文件提交这些更改。

在项目初始设置后使用天线: 在此天线之后,任何时候更改并保存项目中的文件将注释('// @')或取消注释预处理器命令所包含的代码(必须以'//#'开头),具体取决于device.xml文件中的设置保存过程的一部分。

注意:必须删除Blackberry预处理的java文件第一行的// #preprocess语句,因为Antenna必须用于所有java文件而不是Blackberry预处理器。

注意:如果更改了device.xml文件,则必须为每个使用device.xml的项目设置Antenna,如上所述,以使更改生效。< / p>

Antenna使用的预处理器命令和选项在此解释: http://antenna.sourceforge.net/wtkpreprocess.php

答案 1 :(得分:2)

更多面向对象的方法将使用单独的类,在运行时在它们之间进行选择:

public class FirstVideo extends FirstCanvas {
   ...
}

public class SecondVideo extends SecondCanvas {
   ...
}

...
video = (something ? new FirstVideo() : new SecondVideo());

这不需要非标准的编译步骤来实现,也不会打开C / C ++预处理程序指令的恶意恐怖之门。

答案 2 :(得分:1)

我不同意,从安全角度来看,预编译器指令可能非常有用。将调试代码留在即将发布的产品中绝不是一个好主意。这是因为任何人都可以开始检查内存和更改内容,突然之间代码的内部工作就会让攻击者进行检查。但删除调试代码使得在未来发现问题变得更加困难。能够#ifdef出调试代码以便它永远不会放入发布jar中将非常有用。

话虽如此,你不能用Java做到这一点。

查尔斯。