Цель 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
На самом деле не является частью скомпилированного языка, а соглашение, используемое во время компиляции, которая увековечена системными библиотеками.
Расщепление волос, очевидно. Ты настоящий мог компилировать источник 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), как только вы удалите предварительный заголовок/префикс, который импортирует Foundation и, следовательно, Objc.H. (Итак, да, из коробки, шаблоны Xcode делать причина objc.h
импортируется путем импорта Cocoa/Cocoa.h
или же Foundation/Foundation.h
.)
Другие советы
Objective-C правильный суперсет C, так как все, что работает в C, будет работать с Objective-C.
НО,
Поскольку это суперсет, он добавляет некоторые Новые типы, определения и директивы.
Это означает, что если вы используете зарезервированное определение, подобное nil
, вы попадаете в серьезные проблемы.
Вот почему вышеупомянутая программа не компилируется.