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.

Albert Renshaw
  • 17,282
  • 18
  • 107
  • 195
Rodrigo
  • 11,909
  • 23
  • 68
  • 101

1 Answers1

62

Use this code (notice the ## part):

#define NSLog(FORMAT, ...) fprintf(stderr, "%s\n", [[NSString stringWithFormat:FORMAT, ##__VA_ARGS__] UTF8String]);
xuzhe
  • 5,100
  • 22
  • 28