如果Objective C是C的严格超集,那为什么不编译呢?

hrn*_*rnt 3 objective-c

考虑以下源文件,该文件(至少应该是)有效C.

void id() {
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试编译它gcc -c test.m,但我收到以下错误:

test.m:1: error: ‘id’ redeclared as different kind of symbol
<built-in>:0: error: previous declaration of ‘id’ was here 
Run Code Online (Sandbox Code Playgroud)

如果Obj-C是一个严格的超集,那么这不是说所有有效的C程序也是有效的Obj-C程序吗?请注意,我没有#import任何东西,我也没有链接.

当然,也许LLVM(1)在默认情况下做了一些神奇的事情,或者这可能是一个错误.

(1):i686-apple-darwin11-llvm-gcc-4.2(GCC)4.2.1(基于Apple Inc. build 5658)(LLVM build 2336.1.00)

编辑:让我澄清一下这个问题 - 问题不在于id部分,我知道它具有特殊意义.我的观点是,人们普遍认为Obj-C是C的严格超集.但是,如果它的关键字与有效的C程序冲突,则情况并非如此.

因此编译器不保留任何一个id,或者Obj-C不是严格的超集.问题的关键在于询问是哪种情况,或者是否存在我遗漏的明显事实.

Pav*_*ath 5

Superset意味着它还增加了一些额外的功能.就像id在这种情况下.它是Objective C中定义的类型.超集的这些额外功能总是取代子集.

人们习惯使用术语严格超集.你需要带一点盐!

请参阅SO中的这些旧帖子以进行类似的讨论

客观的C 2.0是C的正确超集吗?

C的哪种方言是Objective-C的"严格超集"?