【问题标题】:How to get eclipse to recognize preprocessor statements?如何让 eclipse 识别预处理器语句?
【发布时间】:2009-11-25 16:00:36
【问题描述】:

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

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

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

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

【问题讨论】:

  • Eclipse 和 Java 没有预处理器。你在用EclipseME之类的插件吗?
  • 这很有趣——我从来不知道在 Java 中可以使用预处理器。
  • 他们不是。只有借助一些特殊的 IDE 插件
  • 用C++编程多年,希望这些远离Java。这些是 C++ 帮助开发人员自责的众多方式之一。
  • 艾伦,滥用预处理器指令的人并不是阻止其合法使用的好理由。分离为不同设备平台或 API 级别设计的代码正是预处理器指令应该用于的事情。如果代码差异很小,创建单独的项目或单独的类来完成同样的事情(两者都会创建双重维护)可能是预处理器指令的不良替代品。

标签: java eclipse ide eclipse-plugin


【解决方案1】:

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

安装天线插件:

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

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

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

在“名称:”编辑框中输入“天线”,在“位置:”编辑框中输入“http://antenna.sf.net/update”,然后点击“确定”按钮。

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

点击“完成”按钮。

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

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

将项目标记为可由 Antenna 处理:

如果需要,创建项目。

右键单击项目。

如果旁边没有复选标记,请单击位于弹出菜单四分之三下方的“天线预处理器”选项。

确保 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,这是“项目”/resources,对于黑莓,这是“项目”/res。 (Android 只需要“project”/res 文件夹中的 Android 特定文件。)

为项目设置天线:

通过单击选择项目。

转到项目->属性->天线预处理器。

如果弹出警告提示您找不到设备,请单击“确定”按钮。

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

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

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

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

单击“确定”按钮。

Antenna 现在将遍历项目中的所有文件,并根据 device.xml 中的设置注释 ('// @') 或取消注释预处理器命令所包含的代码(必须以 '//#' 开头)文件。

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

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

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

注意:如果更改了 device.xml 文件,那么您必须再次为使用上述 device.xml 的每个项目设置天线,以使更改生效。

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

【讨论】:

  • +1... 希望我能为您的答案投票不止一次。真的很详细的解释。唯一的事情是用'custom-devices.xml'替换'device.xml',然后它应该可以正常工作......非常感谢......
  • 很好的例子,但是如何快速更改天线的设置,我的意思是使用自定义配置或其他配置?我找不到任何快速切换的方法,我唯一能做的就是定义一个新值
【解决方案2】:

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

public class FirstVideo extends FirstCanvas {
   ...
}

public class SecondVideo extends SecondCanvas {
   ...
}

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

这不需要非标准的编译步骤来实现,也不会为 C/C++ 预处理器指令的可怕恐怖打开大门。

【讨论】:

  • 它并不总是适用于 OO。例如。我已经创建了一个库,该库必须与另一个库一起工作,该库可以(在最终用户中)有两个不兼容的版本。一个版本定义void save(),下一个版本定义为boolean save()。无法在同一源中干净地覆盖这两个定义!另一种用法是定义相同的类以使用原语:维护相同的代码来支持可能很烦人,例如。 int、long、float 和 double。另一种情况是异形窗口代码:在 1.6 中,它使用 Sun 私有 API,在 1.7 中它更标准,您不能同时为两者编写代码。等等。
  • @PhiLho 请参阅Adapter pattern。构建您自己的通用接口(或选择现有替代方案之一)并为其他接口构建适配器。
【解决方案3】:

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

话虽如此,不,你可以在 Java 中做到这一点。

查尔斯。

【讨论】:

    猜你喜欢
    • 2017-07-31
    • 1970-01-01
    • 2012-10-09
    • 1970-01-01
    • 1970-01-01
    • 2012-05-21
    • 1970-01-01
    • 2011-08-05
    • 1970-01-01
    相关资源
    最近更新 更多