目标C 2.0是C的适当超集C吗?
-
23-10-2019 - |
题
我听说Objective-C是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;
}
一旦删除了进口基础的预编译/前缀标头,并在标准的基础工具项目(Main.M)中进行编译并运行良好。 (所以,是的,开箱即用,XCode模板 做 原因 objc.h
通过进口方式导入 Cocoa/Cocoa.h
或者 Foundation/Foundation.h
.)
其他提示
Objective-C A适当的c超集C,因为在C中使用的所有功能都将与Objective-C一起使用。
但,
因为它是超集,它添加了一些 新类型,定义和指令.
这意味着,如果您使用保留的定义 nil
, ,您正在陷入严重的麻烦。
这就是为什么以上程序不编译的原因。
不隶属于 StackOverflow