2013-02-14 29 views
53

在objective-c中,我經常在處理塊等時使用__typeof__(obj)。爲什麼不使用__typeof(obj)typeof(obj)typeof,__typeof和__typeof__之間的區別(Objective-c)

時所使用的?

+2

我知道別人問過類似的問題,但很遺憾並未涵蓋所有這三個問題。 http://stackoverflow.com/questions/7618873/is-there-any-difference-between-typeof-and-typeof,併爲C++ – hfossli 2013-02-14 14:49:35

+1

嗯。我一直使用像'[obj isKindOf:otherObj]'這樣的構造。 – 2013-02-14 14:56:51

+1

對不起,是的。 isKindOfClass是別的。 – 2013-02-14 15:36:15

回答

47

__typeof__()__typeof()是C語言的編譯器專用擴展,因爲標準C不包含這樣的運算符。標準C要求編譯器以雙下劃線作爲語言擴展的前綴(這也是爲什麼你不應該爲自己的函數,變量等做這些)

typeof()是完全相同的,但是會將下劃線從窗口中移出理解每個現代編譯器都支持它。 (其實,現在我想想,VISUAL C++可能不是。它不支持decltype()雖然,這通常提供了相同的行爲typeof()

所有這三個意思是一樣的,但沒有一個是標準的C所以符合編譯器可能會選擇讓任何意義不同的東西。

+2

這句話「如果你正在編寫一個頭文件,當它被包含在ISO C程序中時必須工作,在下面的頁面上寫'__typeof__'而不是'typeof'」似乎暗示某種「標準」在這裏:http:/ /gcc.gnu.org/onlinedocs/gcc/Typeof.html – trojanfoe 2013-02-14 15:37:54

+1

是的,因爲該語言的非標準擴展應該以'__'作爲前綴以標記爲非標準。 'typeof()'在技術上*不好* C,而不僅僅是*非標準* C. – 2013-02-14 15:39:16

+2

好吧。我從來沒有任何理由在我已經完成的20多年的C編程中使用這個特性。我現在不會開始;-) – trojanfoe 2013-02-14 15:42:34

4

希望這將是有益的:

-ansi和各種-std選項禁用某些關鍵字。當您想要使用GNU C擴展或所有程序都可以使用的通用頭文件(包括ISO C程序)時,這會造成麻煩。關鍵字asm,typeof和inline在用-ansi或-std編譯的程序中不可用(儘管in-line可以用-std = c99或-std = c11編譯的程序中使用)。 ISO C99關鍵字限制僅在使用-std = gnu99(最終將成爲默認值)或-std = c99(或等同的-std = iso9899:1999)或使用較晚標準版本的選項時可用。

解決這些問題的方法是在每個有問題的關鍵字的開始和結尾放置'__'。例如,使用__asm__而不是asm,而使用__inline__而不是內聯。

http://gcc.gnu.org/onlinedocs/gcc/Alternate-Keywords.html#Alternate-Keywords

+2

這解釋了'__typeof__',但'__typeof'呢? – 2015-05-09 21:49:48

25

正如其他人提及的,typeof()Ç具有在各自的編譯器的各種支持的擴展。
如果您碰巧正在爲iOS或Mac應用程序編寫Objective-C,那麼很可能您會用編譯器編譯您的應用程序Clang

鏘不支持使用typeof(),但在技術上它是當你的C語言方言被設定爲GNU *類型。然而__typeof__()c *gnu *兩種語言方言中都得到支持 - 如在Clang documentation中詳述的。

現在,如果你在Xcode編寫代碼,對C語言方言的默認設置似乎是GNU99並允許「ASM」'在線「的typeof」設置爲的選項,所以使用typeof()不會給你帶來任何問題。

Xcode project settings

如果你想成爲(可以說)安全使用鏘編譯器時,使用__typeof__()。這樣,如果使用C語言方言進行編輯更改,或者某人決定關閉'typeof'的類型,您將不會受到影響。

+1

[C11 _Generic是一種替代方法](http://stackoverflow.com/a/25893397/895245) – 2015-05-09 21:46:20

+0

__typeof? – 2016-04-22 11:41:27