我听说Objective-C是C的一个适当的超集,但Objective-C 2.0也是吗?
我之所以问这个问题是因为要么它不是,要么我误解了“适当的超集”这个术语,因为这段代码是有效的C语法:
#import <stdio.h>
int main () {
char *nil = "hello";
printf("%s\n",nil);
}
但在Objective-C 2.0中无法编译。显然,这是一个容易解决的问题,但我正在写一篇论文,觉得应该指出这一点。
我听说Objective-C是C的一个适当的超集,但Objective-C 2.0也是吗?
我之所以问这个问题是因为要么它不是,要么我误解了“适当的超集”这个术语,因为这段代码是有效的C语法:
#import <stdio.h>
int main () {
char *nil = "hello";
printf("%s\n",nil);
}
但在Objective-C 2.0中无法编译。显然,这是一个容易解决的问题,但我正在写一篇论文,觉得应该指出这一点。
nil
不是关键字。在objc.h [Mac OS X上]中定义了nil
(而__DARWIN_NULL
实际上只是NULL
):
#ifndef nil
#define nil __DARWIN_NULL /* id of Nil instance */
#endif
也就是说,nil
并不真正是编译语言的一部分,而是在编译过程中使用的一种惯例,由系统库延续。
显然,这只是纠结于细节。实际上,你可以编译没有nil
的Objective-C源代码。
这就像是在问:“我可以编写一个工具,并将变量命名为deflate
,同时仍使用zlib.h
接口吗?” 当然可以,但会很丑陋。
实际上,编译器并不会自动包含objc.h
。下面是示例:
#include <stdio.h>
int main() {
int nil = 5;
fprintf(stdout, "Hello %d\n", nil);
return 0;
}
如果您删除导入 Foundation 和因此导入 objc.h 的预编译/前缀头文件(在 main.m 中) ,则可以在标准 Foundation 工具项目中编译并运行得很好。(因此,是的,开箱即用,Xcode 模板确实通过导入 Cocoa/Cocoa.h 或 Foundation/Foundation.h 导致导入 objc.h )
Objective-C是C语言的一个合适的超集,因为C语言中的所有内容都可以在Objective-C中使用。
由于它是一个超集,它添加了一些新类型、定义和指令。
这意味着如果您使用保留的定义,比如nil
,那么您会遇到严重的问题。
这就是为什么上面的程序无法编译的原因。
nil
的头文件)。 - dreamlaxgcc some_file.m -o some_file
。因此,虽然可能存在一些有效的C程序不是有效的Objective-C程序,但这个不是其中之一。 - Matthew Flaschenid
作为标识符的 C 程序都将无法编译为 Obj-C。 - Fred Foo