考虑以下源文件,该文件(至少应该是)有效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不是严格的超集.问题的关键在于询问是哪种情况,或者是否存在我遗漏的明显事实.
Superset意味着它还增加了一些额外的功能.就像id在这种情况下.它是Objective C中定义的类型.超集的这些额外功能总是取代子集.
人们习惯使用术语严格超集.你需要带一点盐!
请参阅SO中的这些旧帖子以进行类似的讨论
| 归档时间: |
|
| 查看次数: |
877 次 |
| 最近记录: |