Search code examples
cocoacore-animation32bit-64bitc-preprocessorsetbounds

Can’t setBounds even with NS_BUILD_32_LIKE_64 macro


My project compiles and runs OK in debug mode, but when I switch to release x86_64 compiling, I get compiler errors for attempts to setBounds using NSRect. (The errors read “incompatible type for argument 1 of setBounds”.)

There are lots of posts which I take to be suggesting to add the NS_BUILD_32_LIKE_64 macro definition above the Cocoa (Foundation) import, so that the “if NS_BUILD_32_LIKE_64” language in NSGeometry.h will be true and the necesseary typedefs will be used. So I added the macro definition to the h file of the offending class:

#define NS_BUILD_32_LIKE_64 1
#import <Cocoa/Cocoa.h>

And I still get the same compile errors.

I also tried converting explicitly from NSRect to CGRect, so that instead of this . . .

// rectIncomingSource is an NSRect
calayer.bounds = rectIncomingSource;

. . . I wrote this:

calayer.bounds = CGRectMake(rectIncomingSource.origin.x, rectIncomingSource.origin.y, rectIncomingSource.size.width, rectIncomingSource.size.height);

Same errors.

And why would setting bounds be the only problem? Per Apple docs, NSInteger and NSUInteger are the main conversion problem, and I use them all over the place, but the compiler doesn’t complain about them. So why would it choke on bounds?

I’m probably missing something really simple here — for which I apologize to the wizards. Any help for the blind?


Solution

  • The target info window gave me the clue to figure this out:

    I was putting the NS_BUILD_32_LIKE_64 define in a particular class's h file. It should have been in the prefix header file, the one with the pch extension that usually resides in the project's "Other Sources."

    #ifdef __OBJC__
        #define NS_BUILD_32_LIKE_64 1 // this line added
        #import <Cocoa/Cocoa.h>
    #endif
    

    Well, yeah, I suppose this was obvious. But maybe some other preprocessor neophyte will find this clarification helpful, so I won't delete the question.

    And I still don't understand why setting bounds should have been the only problem. Maybe something to do with core animation?