29

I almost finishing a clean NSLog with this code:

#define NSLog(FORMAT, ...) printf("%s\n", [[NSString stringWithFormat:FORMAT, __VA_ARGS__] UTF8String]);

This work fine if I do this:

 NSLog(@"Show %@ message", @"this");

But, will fail if I user it

 NSLog(@"One argument");

because __VA_ARGS__ is nothing, so it produce

 printf("%s\n", [[NSString stringWithFormat:@"One argument",] UTF8String]);

So, the problem is the comma. Because this is macro, __VA_ARGS__ is nothing. So I can't do things like __VA_ARGS__==nil because will produce ==nil and will fail.

The question is simple: What to do when __VA_ARGS__ is nothing? Or only use comma when have more arguments.

1 Answer 1

62

Use this code (notice the ## part):

#define NSLog(FORMAT, ...) fprintf(stderr, "%s\n", [[NSString stringWithFormat:FORMAT, ##__VA_ARGS__] UTF8String]);
Sign up to request clarification or add additional context in comments.

5 Comments

Work fine. I thought ## make no sense with __VA_ARGS__, but work.
You should change the printf("%s\n" to fprintf( stderr, "%s\n" though. For various reasons, most importantly, printf goes to stout which is cached, stderr is not cached out is output straight away.
Hum.. @Nathan Day. I saw things like this and didn't understand. But if it make things better, I will use :)
Oh how sweet it is! :)
Is there a way to make this global. I still get time and application name for other libraries.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.