目的C 2.0はCの適切なスーパーセットですか?
-
23-10-2019 - |
質問
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
実際にはコンパイルされた言語の一部ではありませんが、システムライブラリによって永続化された編集中に使用される規則です。
明らかに髪を分割します。あなたは本当に できる Object-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 Cの適切なスーパーセット、Cで動作するものはすべてObjective-Cで動作します。
しかし、
スーパーセットなので、いくつか追加します 新しいタイプ、定義、指令.
つまり、次のような定義を使用する場合 nil
, 、あなたは深刻なトラブルに巻き込まれています。
そのため、上記のプログラムはコンパイルされません。