Antenna Preprocess

原文地址:

http://antenna.sourceforge.net/wtkpreprocess.php

  新版的预处理器后端是由Omry Yadan开发的。

  预处理器支持变量操作和访问设备数据库(目前只支持J2ME波兰设备数据库),可以从WtkPreprocess 任务或者Eclipse插件中得到预处理器。在NetBeans移动套件预处理器(支持一些额外指令)推出之后,预处理器得以被模块化。

  WtkPreprocess任务(Task)提供了一个预处理器,类似C语言的预处理。它支持条件编译,允许在一个源文件中包含进另一个源文件。当多个设备共用一份文件,而每个设备都有独有的缺陷、插件api等时,使用预处理来维护这同一份文件就会非常有效。

  在Java编程中,通过预处理源文件来实现差异化管理是相当不寻常的。实际上它可能被纯粹的面向对象主义者视为“邪恶的技术”。这种看法不无道理,接口、抽象类和通过类名加载类都明显是更加清洁的方法,纯粹的面向对象编程是指你通常负担不起在只接受大小不超过30KB的JAR文件的设备上进行开发。一个简单的接口就很容易会耗费JAR上千字节或更多;通过类名来加载特定实现的类,在混淆时通常会遇到问题。而条件编译,却绝对不耗成本(也许,有点骄傲,假定你认为自己是纯粹的面向对象主义者,MIDlet难道不就是一个以小开销而实现在几十种不同的手机上顺畅运行的例证吗?)。(备注:MIDlet,Mobile Information Devices applet,即移动信息设备小程序。是在支持MIDP 的设备上运行的MIDP 应用。它仅利用MIDP 和CLDC 规范所定义的各种应用程序编程接口API。

  需要注意的是,预编译器只预处理了源文件,但没有编译它们。所以仍然需要运行Java编译器编译预处理之后的文件。预处理器过滤“不活跃”的条件代码,不是通过删除的方式而是通过添加评论的方式。编译错误所显示的行数通常与编译原始代码是一样的(除非您使用了# include)。

  除了条件编译之外,预处理器在源码中取代了ant样式属性。

指令集:

  预处理器在Java源文件中支持以下指令。所有预编译指令都以“//”注释作为一行的开始(每行指令的左边允许有空格,但不允许有Java代码)。这样,他们就不会干扰正常的Java编译。预编译指令不能跨越多行代码。此外,在注释符“//”和指令符“#”之间允许有空格,以保持在进行Eclipse代码格式化之后预处理命令的有效性。

指令描述
#ifdef [identifier]identifier代表一个变量(布尔、字符串或整数),该指令检查identifier是否定义了。
true,表示定义了变量identifier,后面的代码将被预处理,嵌套块也会被预处理。
false,表示变量identifier没有被定义,后面的代码将被注释,嵌套块也不被处理评估。
必须以#endif结尾。
#ifndef [identifier]与指令ifdef类似,不同的是:true,表示变量identifier没有被定义。必须以#endif结尾。
#elifdef [identifier]与标准的条件语句else if类似,但是会自动检查变量identifier是否定义了。这条指令只能在以ifdef或者ifndef开始的逻辑语句中作为逻辑补充。
#elifndef [identifier]与标准的条件语句else if类似,但是会自动检查变量identifier是否没有被定义。这条指令只能在以ifdef或者ifndef开始的逻辑语句中作为逻辑补充。
#if [expression]求出表达式expression的值,然后采取相应的处理。必须以#endif结尾。
#elif [expression]与标准的条件语句else if类似,而且只能在以if开头的逻辑块中作为逻辑补充。后面的代码是否被预处理取决于表达式expression的取值。
#else与标准的条件语句else类似,在以if或ifdef或ifndef开头的逻辑块中作为逻辑补充,当前面的逻辑条件都不为true时,才会预处理该指令后面的代码。
#endif该指令用来结束以if或ifdef或ifndef开始的逻辑块。
#condition [expression]该指令必须写在文件的第一行,根据表达式expression的取值,来决定编译时是否包含该文件。
#debug [level]项目属性中Compiling页的 the debug level 的取值,决定了该指令后面的语句应该被注释还是执行。在项目属性中如果debug level 省略或者值不等于 "Off" , 则预编译器将自动debug出错的代码行。该指令用于调试目的的语句如System.out.println。该指令可以嵌套使用。
#mdebug [level]与指令#debug类似,但直到执行到#enddebug指令,才会决定是注释还是执行该指令所在行后面跟随的整个代码块。该指令用于调试目的的语句如System.out.println。该指令可以嵌套使用。如果该指令与if/ifdef/ifndef指令块交叉使用(例如该指令mdebug被包在if指令块之中,而指令enddebug却位于整个if指令块之外),则预处理器将会报错。
#enddebug该指令用来结束#mdebug指令块。
#define [identifier]表达式#define [identifier=value] #define [identifier value],添加临时的能力或者变量到预处理器内存中。该指令不能被用在嵌套块中。
在项目配置属性中定义的全局变量会覆盖这些临时变量。
#undefine [identifier]从内存中移除临时能力或变量。定义在项目配置属性中的全局变量,也能够通过这个指令从预处理内存中被移除。但是不能移除项目或配置变量列表中的变量。
#expand LINE WITH MACROSExpand指令被用来替换代码中的%语句。你可以这样写:
//#expand public static int VERSION = %VERSION%;
假定你定义了VERSION=5,则可以用下面语句替代:
//#expand public static int VERSION = %VERSION%;
public static int VERSION = 5;
//#expand被用来保持预处理操作的可逆性。(没有它,在VERSION = 6时将不可能预处理相同的代码并使用正确的version值替换数字5)




























预编译指令集中的比较语法:

预编译器支持以下三种类型的变量:

1.字符串 strings
2.整型, integers
3.布尔型 boolean values

支持变量间常见的比较,如:<=, <, >=, > and ==。

布尔操作如:&&、||、!和^ 也适用于所有的符号类型。
在布尔操作中整数与字符串表现一样。然而整数比较可以被用在多屏幕尺寸适配中,不同屏幕使用不同的最佳尺寸的图片。例如:
//#if ScreenWidth>100 && ScreenHeight>120
可以指明一段代码块,在屏幕尺寸大于100x120时导入图片。
如果一个变量被定义了,则它就被认为是一个值为true的布尔值;
如果一个变量在任何地方都没有被作为能力或配置而被定义,则它就认为是一个值为false的布尔值。
两个不同类型的变量之间不应该进行比较。然而这种比较不会中断编译过程。如果不同类型的变量在比较,预处理器会报出一个警告,并且按如下方式给出赋值:
1.如果比较运算符左右两侧类型不同,则两侧都将被当做字符串进行字符比较,并给出一个@操作异常,子类关系操作将仍然被执行(允许你检查是否某个整型属于一个特殊的集合)。
2.如果其中的一个变量没有被定义或者被定义为布尔值,则这个变量被认为是一个空字符串""。如果其中一个变量是个整数,则它也会被转化为一个字符串并使用字符比较。

操作符说明
不等于 (!)这个操作符有最高优先级,可用于变量或者表达式。
如: //#if !(ScreenWidth>100 && ScreenHeight>120)用来判断屏幕大小是否小于100x120。
既然(!)运算符有最高优先级,则类似这种写法://#if !ScreenSize=="100x200"就是非法的,会产生语法错误,因为一个布尔结果不能与一个字符串进行比较。
比较运算符比较运算符优先级是第二,用来执行典型的比较运算。因为比较运算可以按字符来比较两个字符串,也可以按算术来比较两个整数,所以支持交叉类型的比较。然而,它们只能用在表达式中比较两个变量,而不是符号。
这里也有一个特殊的比较运算符,执行的是子集的关系运算。这个操作符是@。它左右两边的参数都应该是字符串,由特定的分隔符分隔开的两个集合。操作符@会首先将左右两边的字符串参数认作是集合,然后判断左边参数集合是否是右边参数集合的子集。有效的分隔符是','或者‘;’。分隔符可被混合和反复用在每个参数中,如下面所示:
"gif" @ "gif86, jpeg, gifaboo" = false
"gif" @ "gif gif86 jpeg" = true 
"1 2 4;7,8" @ "0,1,2,3,4,5,6,7,8,9" = true 
"3 5 7 11 13" @ "0,1,2,3,4,5,6,7,8,9" = false
布尔运算布尔运算的优先级最低。布尔操作符主要用在典型的逻辑运算如&&、||和^中,或者检查变量是否定义,并把这些表达式认作布尔表达式。布尔操作符被处理的顺序是:1.&&;2.^;3.||

运算符:

各运算符优先级如下:
1.不等于: !
2.比较: ==,!=,<,<=,>,>=,@
3.与:&&
4.异或: ^
5.或:||




if(MIMO==2) { if(ui->bw1p4->isChecked()) { if(ui->cfi->currentText()=="1(1 PDCCH symbol)") {cfiper=0.2714;} else if(ui->cfi->currentText()=="2(2 PDCCH symbols)") { {cfiper=0.3428;} } else if(ui->cfi->currentText()=="3(3 PDCCH symbols)") { {cfiper=0.4142;} } } else if(ui->bw3->isChecked()) { if(ui->cfi->currentText()=="1(1 PDCCH symbol)") {cfiper=0.1657;} else if(ui->cfi->currentText()=="2(2 PDCCH symbols)") { {cfiper=0.2371;} } else if(ui->cfi->currentText()=="3(3 PDCCH symbols)") { {cfiper=0.3085;} } } else if(ui->bw5->isChecked()) { if(ui->cfi->currentText()=="1(1 PDCCH symbol)") {cfiper=0.1565;} else if(ui->cfi->currentText()=="2(2 PDCCH symbols)") { {cfiper=0.228;} } else if(ui->cfi->currentText()=="3(3 PDCCH symbols)") { {cfiper=0.2994;} } } } else if(MIMO==1) { if(ui->bw1p4->isChecked()) { if(ui->cfi->currentText()=="1(1 PDCCH symbol)") {cfiper=0.2375;} else if(ui->cfi->currentText()=="2(2 PDCCH symbols)") { {cfiper=0.3071;} } else if(ui->cfi->currentText()=="3(3 PDCCH symbols)") { {cfiper=0.3785;} } } else if(ui->bw3->isChecked()) { if(ui->cfi->currentText()=="1(1 PDCCH symbol)") {cfiper=0.13;} else if(ui->cfi->currentText()=="2(2 PDCCH symbols)") { {cfiper=0.2014;} } else if(ui->cfi->currentText()=="3(3 PDCCH symbols)") { {cfiper=0.2728;} } } else if(ui->bw5->isChecked()) { if(ui->cfi->currentText()=="1(1 PDCCH symbol)") {cfiper=0.1209;} else if(ui->cfi->currentText()=="2(2 PDCCH symbols)") { {cfiper=0.1923;} } else if(ui->cfi->currentText()=="3(3 PDCCH symbols)") { {cfiper=0.2637;} } } }精简代码, 注意cfiper是不一样的。
最新发布
08-20
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值