typeof,__ typeof和__typeof__之间的区别(Objective-c)

hfo*_*sli 63 objective-c

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

什么时候用哪个?

Jon*_*pan 55

__typeof__()并且__typeof()是C语言的特定于编译器的扩展,因为标准C不包括这样的运算符.标准C要求编译器使用双下划线为语言扩展添加前缀(这也是您不应该为自己的函数,变量等执行此操作的原因)

typeof()是完全相同的,但是将下划线抛出窗口,理解每个现代编译器都支持它.(实际上,现在我考虑一下,Visual C++可能没有.它确实支持decltype(),它通常提供与之相同的行为typeof().)

所有三个都意味着相同的东西,但没有一个是标准的C,所以符合标准的编译器可以选择使任何意思有所不同.

  • 是的,因为该语言的非标准扩展应以`__` 为前缀,以将它们标记为非标准。`typeof()` 在技术上是*糟糕的* C,而不仅仅是*非标准* C。 (4认同)
  • 句子"如果你正在编写一个包含在ISO C程序中必须工作的头文件,在下一页上写`__typeof__`而不是`typeof`"似乎暗示某种"标准"在这里:http:// gcc.gnu.org/onlinedocs/gcc/Typeof.html (3认同)
  • 那么`__typeof()`和`__typeof __()`之间的区别是什么? (3认同)
  • 好的一个.在我做过的20多年的C编程中,我从来没有任何理由使用这个功能.我现在不打算开始;-) (2认同)

Mul*_*xel 30

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

Clang确实支持使用typeof(),但从技术上讲,它适用于将C语言方言设置为gnu*类型的情况.但是__typeof__()支持两个C*GNU*语言方言-作为锵中详细文档.

现在如果您使用Xcode编写代码,C语言方言的默认设置似乎是GNU99,允许'asm''内联''typeof'的选项设置为Yes,因此使用typeof()不会带来任何问题.

Xcode项目设置

如果您希望在使用Clang编译器时(可以说)更安全,请使用__typeof__().这样,如果用于编译的C语言方言发生变化,或者某人决定关闭'typeof'的限额,您将不会受到影响.

  • 那么 __typeof 呢? (3认同)

par*_*rbo 5

希望这会有所帮助:

-ansi和各种-std选项禁用某些关键字。当您要使用GNU C扩展名或应由所有程序(包括ISO C程序)使用的通用头文件时,这会引起麻烦。关键字asm,typeof和inline在使用-ansi或-std编译的程序中不可用(尽管可以在使用-std = c99或-std = c11编译的程序中使用inline)。仅当使用-std = gnu99(最终将是默认设置)或-std = c99(或等效的-std = iso9899:1999)或更高版本的标准选项时,ISO C99关键字限制才可用。

解决这些问题的方法是在每个有问题的关键字的开头和结尾加上“ __”。例如,使用__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

  • 这解释了__typeof__,但是__typeof呢? (2认同)
  • @CiroSantilli新疆改造中心996ICU六四事件 AFAIK GCC/clang 支持将非标准关键字两边用 `__` 括起来,但是,它不会强制尾随 `__` 的存在。所以 `__typeof` 只是一个 `__typeof__` ,其中尾随下划线丢失,编译器不关心。也适用于“__asm”和“__inline”。 (2认同)