I’ve found a bunch of macro variations on how to use NSLog as a basis and adding PRETTY_FUNC and LINE but all the variations of those macros simply output the result to the console.
I’d like to have a macro that can take a format with a variable number of arguments, add the name of the method and line number where it was called and then return an NSString but so far, the compiler always complains where I call it. My latest version is as follow:
#define FileLog(format, ...) {\
return [NSString stringWithFormat:@"\n %s [Line %d] \n %@",
__PRETTY_FUNCTION__,
__LINE__,
[NSString stringWithFormat:(format), ##__VA_ARGS__]];\
}
Each time I call it from my code, the compiler generates one of those errors:
error: expected expression before '{' token
I don’t want to write a log class or use a framework for that. There must be a way to do that with a macro? Anyone?
Thanks in advance!
This is entirely possible with a macro, I think you just need a little more background on them.
First, macros are not functions, so the braces are unnecessary (and, in fact, are the cause of your error). A macro is really a fairly dumb “copy/paste” that is automated by the preprocessor, using syntax that it understands.
In order to define a macro that spans multiple lines and creates an NSString “in place”, you have to escape the newlines with backslashes, like so:
Macros do not “return” like a function does, because, as I mentioned, they are merely a way to “copy/paste” text.
You can use it like so:
If you were to look at the preprocessor output (the file that the preprocessor creates before compilation), the above example would expand to something like: