I've heard that objective-C is a proper superset of C, but is objective-C 2.0?
The reason I ask is that either it isn't, or I misunderstand the phrase 'proper superset', because this code is valid C syntax:
#import <stdio.h>
int main () {
char *nil = "hello";
printf("%s\n",nil);
}
But does not compile in Objective-C 2.0. Obviously, this is an easily fixable problem, but I'm writing a paper, and feel that this is something that should be pointed out.
nil is not a keyword. nil is defined in objc.h [on Mac OS X] (and __DARWIN_NULL is really just NULL):
#ifndef nil
#define nil __DARWIN_NULL /* id of Nil instance */
#endif
That is, nil isn't really part of the compiled language, but a convention used during compilation that is perpetuated by the system libraries.
Splitting hairs, obviously. You really could compile Objective-C source without nil, though.
It is akin to asking "Can I write a tool that has variables named deflate while still using the zlib.h interface?". Sure. But it'll be ugly.
And, in fact, the compiler does not automatically include objc.h. This:
#include <stdio.h>
int main() {
int nil = 5;
fprintf(stdout, "Hello %d\n", nil);
return 0;
}
Compiles and runs just fine in a standard Foundation tool project (in the main.m) once you remove the precompiled/prefix header that imports Foundation and, hence, objc.h. (So, yes, out of the box, the Xcode templates do cause objc.h to be imported by way of importing Cocoa/Cocoa.h or Foundation/Foundation.h.)
Objective-C a proper superset of C, as everything that works in C will work with Objective-C.
as it is a superset, it adds some new types, definitions and directives.
That means that if you use a reserved definition like nil, you are getting into serious trouble.
That's why the above program does not compile.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With