我听说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
不是关键字。 nil
在objc.h [在 Mac OS X 上] 中定义(__DARWIN_NULL
实际上只是NULL
):
#ifndef nil
#define nil __DARWIN_NULL /* id of Nil instance */
#endif
也就是说,nil
它实际上并不是编译语言的一部分,而是系统库在编译期间使用的约定。
分叉头发,很明显。不过,您确实可以在没有 . 的情况下编译 Objective-C 源代码nil
。
这类似于问“我可以编写一个deflate
在仍然使用zlib.h
接口的同时命名变量的工具吗?”。当然。但是会很丑
而且,事实上,编译器不会自动包含 objc.h。这:
#include <stdio.h>
int main() {
int nil = 5;
fprintf(stdout, "Hello %d\n", nil);
return 0;
}
一旦删除了导入 Foundation 的预编译/前缀头文件,因此在标准 Foundation 工具项目(在 main.m 中)中编译和运行得很好,因此,objc.h。(所以,是的,开箱即用,Xcode 模板确实会导致objc.h
通过 importingCocoa/Cocoa.h
或Foundation/Foundation.h
.)
Objective-C 是 C 的适当超集,因为在 C 中工作的所有内容都适用于 Objective-C。
由于它是一个超集,它添加了一些新的类型、定义和指令。
这意味着如果您使用保留定义,例如nil
,您将遇到严重的麻烦。
这就是上述程序无法编译的原因。