70

在 Objective-C 中,我经常__typeof__(obj)在处理块等时使用。为什么不__typeof(obj)使用typeof(obj).

什么时候用哪个?

4

3 回答 3

63

__typeof__()并且__typeof()是 C 语言的特定于编译器的扩展,因为标准 C 不包括这样的运算符。标准 C 要求编译器在语言扩展前加上双下划线(这也是为什么你永远不应该为自己的函数、变量等这样做)

typeof()完全相同,但是在理解每个现代编译器都支持它的情况下将下划线抛出窗口。(实际上,现在我想起来了,Visual C++ 可能不支持。decltype()虽然它确实支持,但通常提供与 . 相同的行为typeof()。)

这三个含义相同,但都不是标准 C,因此符合标准的编译器可能会选择使任何含义有所不同。

于 2013-02-14T15:33:38.417 回答
32

正如其他人所提到的,typeof()它是C的扩展,在各自的编译器中具有各种支持。
如果您碰巧正在为 iOS 或 Mac 应用程序编写 Objective-C,那么您很有可能会使用Clang编译器来编译您的应用程序。

Clang 确实支持使用typeof(),但从技术上讲,它适用于将 C 语言方言设置为gnu*类型的情况。但是, c*gnu*__typeof__()语言方言都支持- 如 Clang文档中所述。

现在,如果您使用 Xcode 编写代码,C 语言方言的默认设置似乎是 GNU99,并且允许'asm' 'inline' 'typeof'的选项设置为Yes,所以使用typeof()不会给你带来任何问题。

Xcode 项目设置

如果您想(可以说)在使用 Clang 编译器时更安全,请使用__typeof__(). 这样,如果用于编译的 C 语言方言发生更改或有人决定关闭'typeof'的允许,您将不会受到影响。

于 2014-12-16T15:41:27.527 回答
6

希望这会有所帮助:

-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

于 2013-06-17T20:57:52.953 回答