含有Slice 定義的文件必須以.ice 擴(kuò)展名結(jié)尾,例如, Clock.ice就是一個(gè)有效的文件名。編譯器拒絕接受其他擴(kuò)展名。
Slice 支持#ifndef、#define、#endif,以及#include 預(yù)處理指令。它們的使用方式有嚴(yán)格的限制:你只能把#ifndef、#define,以及#endif 指令用于創(chuàng)建雙包括(double-include)塊。例如:
#ifndef _CLOCK_ICE
#define _CLOCK_ICE
// #include 文件 here...
//定義 here...
#endif _CLOCK_ICE
我們強(qiáng)烈建議你在所有的Slice 定義中使用雙包括(double-include)塊(所上),防止多次包括同一文件。
#include 指令只能出現(xiàn)在Slice 源文件的開頭,也就是說(shuō),它們必須出現(xiàn)在其他所有Slice 定義的前面。此外,在使用#include 指令時(shí),只允許使用<> 語(yǔ)法來(lái)指定文件名,不能使用""。例如:
#include <File1.ice> // OK
#include "File2.ice" // 不支持!
你不能把這些預(yù)處理指令用于其他目的,也不能使用其他的C++ 預(yù)處理指令 (比如用\ 字符來(lái)連接行、token 粘貼,以及宏展開,等等)。
在Slice 定義里,既可以使用C 的、也可以使用C++ 的注釋風(fēng)格:
Slice 關(guān)鍵字必須小寫。例如, class 和dictionary 都是關(guān)鍵字,必須按照所示方式拼寫。這個(gè)規(guī)則有兩個(gè)例外:Object 和LocalObject 也是關(guān)鍵字,必須按照所示方式讓首字母大寫。
標(biāo)識(shí)符以一個(gè)字母起頭,后面可以跟任意數(shù)目的字母或數(shù)字。Slice 標(biāo)識(shí)符被限制在ASCII 字符范圍內(nèi),不能包含非英語(yǔ)字母,與C++ 標(biāo)識(shí)符不同, Slice 標(biāo)識(shí)符不能有下劃線。這種限制初看上去顯得很苛刻,但卻是必要的:保留下劃線,各種語(yǔ)言映射就獲得了一個(gè)名字空間,不會(huì)與合法的Slice 標(biāo)識(shí)符發(fā)生沖突。于是,這個(gè)名字空間可用于存放從Slice 標(biāo)識(shí)符派生的原生語(yǔ)言標(biāo)識(shí)符,而不用擔(dān)心其他合法的Slice 標(biāo)識(shí)符會(huì)碰巧與之相同,從而發(fā)生沖突 。
標(biāo)識(shí)符(變量名等等)是大小寫不敏感的,但大小寫的拼寫方式必須保持一致(看了后面的話,再理解一下)。例如,在一個(gè)作用域內(nèi), TimeOfDay 和TIMEOFDAY 被認(rèn)為是同一個(gè)標(biāo)識(shí)符。但是,Slice 要求你保持大小寫的一致性。在你引入了一個(gè)標(biāo)識(shí)符之后,你必須始終一致地拼寫它的大寫和小寫字母;否則,編譯器就會(huì)將其視為非法而加以拒絕。這條規(guī)則之所以存在,是要讓Slice 既能映射到忽略標(biāo)識(shí)符大小寫的語(yǔ)言,又能映射到把大小寫不同的標(biāo)識(shí)符當(dāng)作不同標(biāo)識(shí)符的語(yǔ)言。(可以這樣理解,變量名區(qū)分大小寫,并且不可以是相同的單詞)
是關(guān)鍵字的標(biāo)識(shí)符:你可以定義在一種或多種實(shí)現(xiàn)語(yǔ)言中是關(guān)鍵字的Slice 標(biāo)識(shí)符。例如,switch是完全合法的Slice標(biāo)識(shí)符,但也是C++和Java的關(guān)鍵字。語(yǔ)言映射定義了一些規(guī)則來(lái)處理這樣的標(biāo)識(shí)符。要解決這個(gè)問(wèn)題,通常要用一個(gè)前綴來(lái)使映射后的標(biāo)識(shí)符不再是關(guān)鍵字。例如, Slice 標(biāo)識(shí)符switch 被映射到C++ 的_cpp_switch ,以及Java 的_switch。對(duì)關(guān)鍵字進(jìn)行處理的規(guī)則可能會(huì)產(chǎn)生難以閱讀的源碼。像native、throw,或export 這樣的標(biāo)識(shí)符會(huì)與C++ 或Java(或兩者)的關(guān)鍵字發(fā)生沖突。為了讓你和別人生活得更輕松一點(diǎn),你應(yīng)該避免使用是實(shí)現(xiàn)語(yǔ)言的關(guān)鍵字的Slice 標(biāo)識(shí)符。要記住,以后Ice 可能會(huì)增加除C++ 和Java 以外的語(yǔ)言映射。盡管期望你總結(jié)出所有流行的編程語(yǔ)言的所有關(guān)鍵字并不合理,你至少應(yīng)該盡量避免使用常用的關(guān)鍵字。使用像self、import,以及while 這樣的標(biāo)識(shí)符肯定不是好主意。
轉(zhuǎn)義的標(biāo)識(shí)符:在關(guān)鍵字的前面加上一個(gè)反斜線,你可以把Slice 關(guān)鍵字用作標(biāo)識(shí)符,例如:
struct dictionary { // 錯(cuò)誤!
// ...
};
struct \dictionary { // OK
// ...
};
反斜線會(huì)改變關(guān)鍵字通常的含義;在前面的例子中, \dictionary 被當(dāng)作標(biāo)識(shí)符dictionary。轉(zhuǎn)義機(jī)制之所以存在,是要讓我們?cè)谝院竽軌蛟赟lice 中增加關(guān)鍵字,同時(shí)盡量減少對(duì)已有規(guī)范的影響:如果某個(gè)已經(jīng)存在的規(guī)范碰巧使用了新引入的關(guān)鍵字,你只需在新關(guān)鍵字前加上反斜線,就能夠修正該規(guī)范。注意,從風(fēng)格上說(shuō),你應(yīng)該避免用Slice 關(guān)鍵字做標(biāo)識(shí)符(即使反斜線轉(zhuǎn)義允許你這么做)。
保留的標(biāo)識(shí)符:Slice 為Ice 實(shí)現(xiàn)保留了標(biāo)識(shí)符Ice 及以Ice (任何大小寫方式)起頭的所有標(biāo)識(shí)符。例如,如果你試圖定義一個(gè)名為Icecream 的類型, Slice 編譯器會(huì)發(fā)出錯(cuò)誤警告3。以下面任何一種后綴結(jié)尾的Slice 標(biāo)識(shí)符也是保留的:Helper、Holder、Prx,以及Ptr。Java 和C++ 語(yǔ)言映射使用了這些后綴,保留它們是為了防止在生成的代碼中發(fā)生沖突。
(注:ICE 1.3的中文手冊(cè)上沒有“模塊”這一部分)模塊來(lái)組織一組相關(guān)的語(yǔ)句是為了解決名字沖突。模塊可以包含所有合法的Slice語(yǔ)句和子模塊。你可以用一些不常用的詞來(lái)給最外層的模塊命名,比如公司名、產(chǎn)品名等等。
module ZeroC {
module Client {
// Definitions here...
};
module Server {
// Definitions here...
};
};
Slice要求所有的定義都是模塊的一部分,比如,下面的語(yǔ)句就是非法的。
interface I { // 錯(cuò)誤:全局空間中只可以有模塊
// ...
};
多個(gè)文件可以共享同一個(gè)模塊,比如:
module ZeroC {
// Definitions here...
};
//另一個(gè)文件中 :
module ZeroC { // OK, reopened module
// More definitions here...
};
把一個(gè)大的模塊放到幾個(gè)文件中去可以方便編譯(你只需重新編譯被修改的文件,而沒有必要編譯整個(gè)模塊)。
模塊將映射的語(yǔ)言中的相應(yīng)結(jié)構(gòu),比如 C++, C#, 和 Visual Basic, Slice的modules被映射為namespaces;java中被映射為package.
除了少數(shù)與特定的程序語(yǔ)言相關(guān)的調(diào)用之外,ice的絕大部分API(應(yīng)用程序接口)都是用Slice來(lái)定義的 。這樣做的好處是可以用一個(gè)ICE API定義文件來(lái)支持所有的程序語(yǔ)言。
![[注意]](http://enjoylanguage.sourceforge.net/picture/images/note.png) |
注意 |
為了保證代碼的簡(jiǎn)潔,以后文章中提及的Slice定義沒有寫出包含的模塊,你要假定該語(yǔ)句是在一個(gè)模塊中。 |
表 2.1. Slice的數(shù)據(jù)類型
類型 |
取值范圍 |
大小(單位:bit) |
bool |
false or true |
≥ 1 |
byte |
-128-127或0-255 |
≥ 8 |
short |
2-15至215-1 |
≥ 16 |
int |
2-31至231-1 |
≥ 32 |
long |
2-63至263-1 |
≥ 64 |
float |
IEEE的單精度 |
≥ 32 bits |
double |
IEEE的雙精度 |
≥ 64 bits |
string |
所有Unicode 字符,除了所有位為零的字符 |
變長(zhǎng) |