Я услышал, что цель-C является надлежащим надмножеством C, но объективна-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 tool (в main.m), как только вы удалите прекомпилированный/prefix заголовок, который импортирует Foundation и, следовательно, objc.h. (Итак, да, из коробки, шаблоны Xcode do заставляют objc.h
импортироваться путем импорта Cocoa/Cocoa.h
или Foundation/Foundation.h
)
Objective-C надлежащий надмножество C, так как все, что работает в C, будет работать с Objective-C.
так как это расширенный набор, он добавляет несколько новых типов, определений и директив .
Это означает, что если вы используете зарезервированное определение, например nil
, вы попадете в серьезные проблемы.
Вот почему указанная выше программа не компилируется.