采用0或1个参数的Variadic宏?

lms*_*lms 3 c objective-c c-preprocessor

您将如何编写可以采用1或0参数的可变参数宏.就是这样的:

GREET()         // returns @"Hello World"
GREET(@"John")  // returns @"Hello John"
Run Code Online (Sandbox Code Playgroud)

Ric*_*III 9

这很简单,你有这样的事情:

#define __NARGS(unused, _1, _2, _3, _4, _5, VAL, ...) VAL
#define NARGS(...) __NARGS(unused, ## __VA_ARGS__, 5, 4, 3, 2, 1, 0)

#define __GREET(ARGC, ARGS...) GREET_ ## ARGC (ARGS)
#define _GREET(ARGC, ARGS...) __GREET(ARGC, ARGS)
#define GREET(...) _GREET(NARGS(__VA_ARGS__), __VA_ARGS__)

#define GREET_0(...) @"Hello World!"
#define GREET_1(ARG, ...) @"Hello, " ARG // strings are auto-concatenated in objc

int main()
{
    NSLog(@"%@", GREET());
    NSLog(@"%@", GREET(@"John"));
}
Run Code Online (Sandbox Code Playgroud)

输出:

2012-09-30 11:56:48.478 TestProj[51823:303] Hello World!
2012-09-30 11:56:48.480 TestProj[51823:303] Hello, John

现在,这非常复杂,但假设您从基本层面了解预处理器的工作原理,您应该能够很好地理解正在发生的事情.

  • 真棒."很简单",但是?;) (3认同)