2009-12-09 102 views
16

昨天在CocoaHeadsÖresund會議上,peylow已經構建了一個偉大的ObjC測驗。當最終的問題進行評估時,競爭非常激烈,三人留下了相同的分數:Objective-C添加到C的保留關鍵字有多少?Objective-C中的保留關鍵字?

隨後發生了一些激烈的辯論。大家一致認爲@interface,@implementation等都是預處理器指令而不是關鍵字,但是怎麼樣像in?它可能是一個關鍵字,但它不是一個保留的關鍵字。例如,下面將編譯沒有錯誤或警告:

NSArray* in; 
for (in in in) 
    NSLog(@"bwahahaa"); 

我們得出的結論是ObjC增加沒有保留關鍵字C,有人贏得了一個看似很好賺來的書。

但今天我試着編譯一些更爲系統的濫用,試圖像這樣的事情:

int self = 45; 
self++; 
int y = self; 

,編譯的罰款,並在相同的代碼工作替換爲自己和BOOL, bycopy, inout, oneway, byref, SEL,IMP

使用id作爲變量名,第一行和最後一行編譯,但不是第二行。 ProtocolClass也是如此。

使用super,第一行編譯,但不是第二行和第三行。

隨着YESNO,並NULL,所有三行無法編譯,可能是因爲他們只是定義爲truefalsenil

它看起來像我很多這是海灣合作委員會越來越困惑,我不太確定它反映什麼是和不是保留在Objective-C中的關鍵字。爲什麼,例如,可以使用self作爲int的名稱,而不是super

第一個賦值總是起作用的事實(除了有YES,NO和NULL)看起來似乎支持這樣一種觀點,即沒有一個候選是C中未找到的技術上保留的關鍵字。

有人能給我們一個這個棘手問題的權威解釋嗎?

幾個人的榮譽危在旦夕。

編輯:正如Nikolai Ruhe指出的,我們需要明確定義「關鍵字」才能繼續。 Niko引用了一篇維基百科文章,指出一個關鍵字是「具有特定含義的詞或標識符」。

我認爲是合理使用這種定義從同一文章:

在許多語言中,例如C和 類似的環境,如C++,一個 關鍵字是一個保留字,其 識別語法形成。單詞 用於控制流程結構中,如 就好像那麼,否則就是關鍵字。在 這些語言中,關鍵字不能也用 作爲變量名或 函數。

此外,作爲物品的狀態:

典型地,當程序員試圖 使用關鍵字對變量或 函數名,一個編譯錯誤 將被觸發。

從這個意義上說,那麼是否有任何保留的關鍵字是predefined in the language’s formal specifications and cannot be used as a user-defined name

+0

一些相關材料在這裏:http://stackoverflow.com/questions/25749/what-does-the-symbol-represent-in-objective-c – Felixyz 2009-12-19 00:55:38

回答

1

看一看Objective-C Programming Language會給你一些關於可能與否的線索。由於某些「關鍵字」是在頭文件中定義的,因此它們的替換可能會導致觀察到(和意外)的行爲。

+0

沒錯。所以問題是:在Objective-C中是否存在任何真正的保留關鍵字(超出了C中已經保留的那些關鍵字)。 – Felixyz 2009-12-09 12:58:13

+1

沒有其他語言意義上的保留關鍵字。它更像是可以與你的代碼嚴重交互的定義。這一切都取決於預處理器的工作。 – 2009-12-09 13:54:59

1

Wikipedia關鍵字定義如下:

在計算機程序,關鍵字是具有特定意義的編程語言中的字或標識符。

我會把它翻譯成:一種語言中的關鍵字是語法中的非終端。 (順便說一句,該語法本身不包含「關鍵字」一詞,因此不存在混淆)。

grammar端子將是:

  • 空隙
  • INT
  • 浮子
  • 簽署
  • 無符號
  • ID
  • 常量
  • 揮發性
  • INOUT
  • bycopy
  • 按地址
  • 單向
  • 超級
  • @interface
  • @end
  • @implementation
  • @end
  • @interface
  • @end
  • @implementation
  • @end
  • @protoco
  • @end
  • @class
+0

問題是哪些保留關鍵字ObjC可能**將**添加到C.正如您在示例中看到的,您可以自由使用「in」作爲變量的名稱,因此它顯然不會被視爲保留關鍵字。 – Felixyz 2009-12-09 12:57:07

+1

我的意思是,「int float = 45;」這個事實無法編譯,而「int id = 45;」編譯罰款告訴我們一些事情。 – Felixyz 2009-12-09 13:01:14

+0

他們不是「例子」。據我所知,這是完整的清單。而且,這取決於您想要調用關鍵字的內容。我給你我對這個問題的回答。 – nes1983 2009-12-09 13:09:27

1

你可以檢查出The Objective-C Programming Language

據我所知,該文件沒有將任何東西歸類爲「保留字」。 @implementation,@interface等被稱爲「編譯器指令」。

9

大家一致認爲,@interface,@implementation等都是預處理器指令,而不是關鍵字

然後所有的人都錯了。 #import#pragma是預處理指令。 @interface, @implementation, @protocol等是Objective-C的關鍵詞,它們是編譯器指令。由於NeXT擴展了GCC以在沒有Stepstone最初的Objective-C預處理器實現的情況下編譯Objective-C,所以它們不是預處理器指令。

+0

然後這就意味着@interface是一個關鍵字(在上面的編輯中指出),但id不是,因爲編譯器拒絕編譯,例如「int @interface = 1;」但很高興使用id作爲int的名稱。但是再次,編譯器也不允許「int @icecream = 1;」。那麼,我們在哪裏? #import - 預處理指令 @interface - 編譯指令 @ - 保留字符 id/self/in - 在某些情況下特殊含義但不保留 – Felixyz 2009-12-09 14:39:36

+0

id是typedef。你可以在objc.h中找到它 – NSResponder 2009-12-09 15:12:44

4

重新:尼古拉汝河的建議自我是一個關鍵字

self被一個參數id類型的一個Objective-C方法(類似於_cmd如何也是PARAM,SEL類型的),而不是一個關鍵字。 nil是一個擴展到NULL的宏。我有點失望,super不擴展到一個宏,也不是一個參數。

從維基百科條目:

目的-C是基於C的頂部上的薄層,而且是C的一個嚴格的超是可能的編譯任何C程序用一個Objective-C編譯器,和在Objective-C類中自由地包含C代碼。

這將阻止Objective-C向該語言添加任何受限關鍵字。

+0

這是一個很好的觀點,儘管gcc顯然沒有完全遵守限制。 – Felixyz 2009-12-09 17:19:00

+0

結論是不正確的。一種語言的超集可以使用原始語言中非法的術語添加關鍵字。而這正是Objective-C所做的。 – 2009-12-09 20:20:56

+0

關於'super'不是宏:編譯器必須能夠識別'super',因爲它必須使用正確的消息類型(調用'objc_msgSendSuper'而不是'objc_msgSend')。 'super'指向與'self'相同的對象,因此沒有太多的意義使它成爲另一個論點。 – 2009-12-09 20:29:10

2

文法Appendix B of the original 1995 booksuper定義爲「文字符號」終端,這是一個特殊情況在消息接收機語法。

in文字符號是ObjC 1.0 協議限定符的一部分,並且在ObjC 2.0(不具有正式語法定義AFAIK)快速枚舉語法被重新使用。如果調用void關鍵字

id被定義爲一起voidcharunsigned,typedef操作類型等類型說明符的一部分,那麼id過。