On Jun 1, 2009, at 4:33 PM, Dave DeLong wrote:

I'm writing a simple test project to try and isolate some unexpected behavior, and found more unexpected behavior (not what I was looking for).

I'm trying to use a simple NSAssert macro, like so:

NSAssert(NO, [NSString stringWithFormat:@"Caught unexpected exception: %@", e]);

However, when I try to compile, I get the error that "macro NSAssert passed 3 arguments, but takes just 2". To verify what I'm seeing, I tried changing it to:

NSAssert(NO, [NSString stringWithFormat:@"Caught unexpected exception: %@, %@", e, e]);

This tells me I'm passing 4 arguments to NSAssert (instead of the required 2). If I change it to:

NSString *err = [NSString stringWithFormat:@"Caught unexpected exception: %@", e];
NSAssert(NO, err);

That will compile appropriately. It would therefore appear that the statement is not getting correctly parsed.

So my question is: Is this expected/documented behavior? (My searches haven't found anything) If it isn't, is this a known issue? If not, where would be the best place to file a bug?

The problem seems to be that NSAssert is a macro, which is handled by the preprocessor rather than the compiler. While the compiler has been extended to understand Objective-C, the preprocessor may not have been. It might not be "legal" to extend it that way, since the preprocessor is used (abused?) in other contexts, for text processing.

It should be possible to work around the problem by surrounding the second argument in an extra pair of parentheses.

Regards,
Ken

_______________________________________________

Cocoa-dev mailing list ([email protected])

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to [email protected]

Reply via email to