假设我们有这样的宏
#define FOO(type,name) type name
Run Code Online (Sandbox Code Playgroud)
我们可以使用哪个
FOO(int, int_var);
Run Code Online (Sandbox Code Playgroud)
但并不总是那么简单:
FOO(std::map<int, int>, map_var); // error: macro "FOO" passed 3 arguments, but takes just 2
Run Code Online (Sandbox Code Playgroud)
我们当然可以这样做:
typedef std::map<int, int> map_int_int_t;
FOO(map_int_int_t, map_var); // OK
Run Code Online (Sandbox Code Playgroud)
这不是非常符合人体工程学的.必须处理类型不兼容的问题.知道如何用宏来解决这个问题吗?
考虑一个简单的宏:
#define ECHO(x) x
ECHO(foo(1, 2))
Run Code Online (Sandbox Code Playgroud)
这会产生我们期望的确切输出:
foo(1, 2)
Run Code Online (Sandbox Code Playgroud)
上面的示例有效,因为预处理器可以识别与函数调用相邻的括号.
现在考虑如果我使用模板而不是函数调用会发生什么:
ECHO(template<int, bool>)
Run Code Online (Sandbox Code Playgroud)
这会导致错误,因为预处理器会将宏template<int和bool>作为两个单独的参数解释为宏.预处理器无法识别<>范围!
无论如何在宏中使用这样的模板?
我刚刚创建了一个Xcode项目并编写了以下代码:
#define foo(x) x
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
int n = 666;
NSString* string = foo([NSString stringWithFormat: @"%d", n]);
NSLog (@"string is %@", string);
[self.window makeKeyAndVisible];
return YES;
}
Run Code Online (Sandbox Code Playgroud)
当我尝试运行它时,我得到了一堆错误,因为预处理器决定stringWithFormat之后的逗号:应该将两个宏参数分开,因此我使用了两个参数而不是正确的参数.
所以当我想在我的宏内部的语句中使用逗号时,我该怎么办?
这个C++问题提出了一种方法来围绕逗号放置一些圆形的parens(),这显然导致预处理器意识到逗号不是宏参数分隔符.但是,在我的头脑中,我并没有想到在目标C中这样做的方法.