D/Objective-C 64bit

Jacob Carlborg via Digitalmars-d-announce digitalmars-d-announce at puremagic.com
Thu Nov 6 12:39:49 PST 2014


On 2014-11-06 17:06, Christian Schneider wrote:
> Oh, just found out, it seems that currently the extern C declarations
> don't work. This comes from the original Chocolat range.d
>
> extern (C) {
> nothrow:
>
>      NSRange      NSUnionRange(NSRange range1, NSRange range2) ;
>      NSRange      NSIntersectionRange(NSRange range1, NSRange range2) ;
>      NSString     NSStringFromRange(NSRange range) ;
>      NSRange      NSRangeFromString(NSString aString) ;
>
>      NSRange     NSMakeRange(NSUInteger loc, NSUInteger len) ;
>      NSUInteger     NSMaxRange(NSRange range) ;
>      bool         NSEqualRanges(NSRange range1, NSRange range2) ;
> }
>
> When trying to use NSMakeRange i get:
>
> Undefined symbols for architecture x86_64:
>    "_NSMakeRange", referenced from: ....

I wasn't able to link with the symbol either. But when I tried in 
Objective-C it worked, but only when I imported Foundation.h, not when I 
declared NSMakeRange myself. That got me thinking and I had a look in 
the Foundation NSRange.h header file. "NSMakeRange" and friends are 
implement directly in the header file to allow inlining. D cannot access 
inlined functions if they don't exist in a library.

In general you need to reimplement these functions in D. In this 
particular case, with NSMakeRange, you can just do this in D instead:

auto range = NSRange(1, 2);

The above is a syntax that is allowed for all structs. If you really 
want to type "NSMakeRange" you need implement the function yourself or 
make an alias and use the above syntax:

alias NSMakeRange = NSRange;

The downside with the alias is that it allows to use "NSMakeRange" as a 
struct as well:

NSMakeRange range;

> Also when I tried to declare / use extern strings like from
> NSApplication.h:
>
> APPKIT_EXTERN NSString *NSApplicationDidHideNotification;
>
> I found no way to get this working. Is this a limitation of the current
> 64 bit port?

I think that should work. How did you declare it? It should be declared 
like this:

extern (C) extern NSString NSApplicationDidHideNotification;

I tried with a standard D compiler and void* instead of NSString and 
that worked.

"extern (C)" tells the compiler to use C linkage, the second "extern" 
tells the compiler this symbols is defined somewhere else, i.e. in some 
library.

-- 
/Jacob Carlborg


More information about the Digitalmars-d-announce mailing list