相关疑难解决方法(0)

C/C++宏中的逗号

假设我们有这样的宏

#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)

这不是非常符合人体工程学的.必须处理类型不兼容的问题.知道如何用宏来解决这个问题吗?

c c++ macros c-preprocessor

93
推荐指数
4
解决办法
3万
查看次数

在没有括号的宏中使用逗号:如何与模板混合和匹配?

考虑一个简单的宏:

#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<intbool>作为两个单独的参数解释为宏.预处理器无法识别<>范围!

无论如何在宏中使用这样的模板?

c++ macros

8
推荐指数
2
解决办法
6163
查看次数

逗号在宏内部的语句中被误解为宏参数分隔符

我刚刚创建了一个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中这样做的方法.

iphone macros objective-c

1
推荐指数
1
解决办法
469
查看次数

标签 统计

macros ×3

c++ ×2

c ×1

c-preprocessor ×1

iphone ×1

objective-c ×1