在 Objective-C 中,我经常__typeof__(obj)
在处理块等时使用。为什么不__typeof(obj)
使用typeof(obj)
.
什么时候用哪个?
在 Objective-C 中,我经常__typeof__(obj)
在处理块等时使用。为什么不__typeof(obj)
使用typeof(obj)
.
什么时候用哪个?
__typeof__()
并且__typeof()
是 C 语言的特定于编译器的扩展,因为标准 C 不包括这样的运算符。标准 C 要求编译器在语言扩展前加上双下划线(这也是为什么你永远不应该为自己的函数、变量等这样做)
typeof()
完全相同,但是在理解每个现代编译器都支持它的情况下将下划线抛出窗口。(实际上,现在我想起来了,Visual C++ 可能不支持。decltype()
虽然它确实支持,但通常提供与 . 相同的行为typeof()
。)
这三个含义相同,但都不是标准 C,因此符合标准的编译器可能会选择使任何含义有所不同。
正如其他人所提到的,typeof()
它是C的扩展,在各自的编译器中具有各种支持。
如果您碰巧正在为 iOS 或 Mac 应用程序编写 Objective-C,那么您很有可能会使用Clang编译器来编译您的应用程序。
Clang 确实支持使用typeof()
,但从技术上讲,它适用于将 C 语言方言设置为gnu*类型的情况。但是, c*和gnu*__typeof__()
语言方言都支持- 如 Clang文档中所述。
现在,如果您使用 Xcode 编写代码,C 语言方言的默认设置似乎是 GNU99,并且允许'asm' 'inline' 'typeof'的选项设置为Yes,所以使用typeof()
不会给你带来任何问题。
如果您想(可以说)在使用 Clang 编译器时更安全,请使用__typeof__()
. 这样,如果用于编译的 C 语言方言发生更改或有人决定关闭'typeof'的允许,您将不会受到影响。
希望这会有所帮助:
-ansi 和各种 -std 选项禁用某些关键字。当您想要使用 GNU C 扩展或应该由所有程序(包括 ISO C 程序)使用的通用头文件时,这会导致麻烦。关键字 asm、typeof 和 inline 在使用 -ansi 或 -std 编译的程序中不可用(尽管 inline 可以在使用 -std=c99 或 -std=c11 编译的程序中使用)。ISO C99 关键字限制仅在使用 -std=gnu99(最终将成为默认值)或 -std=c99(或等效的 -std=iso9899:1999)或更高标准版本的选项时可用。
解决这些问题的方法是在每个有问题的关键字的开头和结尾都放置“__”。例如,使用 __asm__ 代替 asm,使用 __inline__ 代替 inline。
http://gcc.gnu.org/onlinedocs/gcc/Alternate-Keywords.html#Alternate-Keywords
https://clang.llvm.org/docs/UsersManual.html#c-language-features