gnustep-dev
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: libobjc: should nil be an id?


From: David Chisnall
Subject: Re: libobjc: should nil be an id?
Date: Tue, 1 Aug 2017 10:28:33 +0100

Hi,

I suspect that this is a C++-specific error and relates to your host platform 
incorrectly defining NULL.  In C, any pointer type can be cast to and from a 
`void*`, so you can cast `NULL` (typically defined as `(void*)0`) to an `id` or 
cast `nil` to a `void*` without issue.  Unfortunately, in C++ this is not the 
case: `void*` is not special and so you need special handling.  This is fixed 
in C++11 by providing `nullptr` as a language keyword: `nullptr` is a canonical 
null pointer that can be cast to any pointer type. C++ implementations are 
recommended to define `NULL` to `nullptr`, but not all do.

Apple appears to define `nil` as `nullptr` for C++.  This will work, but it 
also allows incorrect code to compile: assigning `nil` to a non-object variable 
implies that whoever wrote the code assumes that the value is an object, when 
it isn’t.  Masking this is probably a bad idea.

David

> On 1 Aug 2017, at 00:43, Daniel Ferreira (theiostream) <address@hidden> wrote:
> 
> Hi,
> 
> In libobjc2, `nil` is defined as a null pointer cast to an `id`[1].
> However, this breaks a lot of stuff targeted to Apple's libobjc which
> relies on `nil` and `NULL` being interchangeable.
> 
> I've experimented removing that cast from the runtime.h header and
> this works fine for compiling WebKit. This breaks libs-base and
> libs-gui, though, with stuff like:
> 
>> NSKeyedUnarchiver.m:862:33: error: cast to union type from type 'void *' not 
>> present in union
>>                       GSIArrayAddItem(_objMap, (GSIArrayItem)nil);
> 
> How do you suggest handling this issue?
> 
> -- Daniel.
> 
> [1]: https://github.com/gnustep/libobjc2/blob/master/objc/runtime.h#L207
> 
> _______________________________________________
> Gnustep-dev mailing list
> address@hidden
> https://lists.gnu.org/mailman/listinfo/gnustep-dev




reply via email to

[Prev in Thread] Current Thread [Next in Thread]