在Xcode中定义lambda(assert.h)中的lambda时,为类似函数的宏调用编译错误提供了太多参数[c ++]

时间:2016-03-12 11:58:38

标签: c++ xcode c++11 lambda macros

我正在使用assert.h中的断言宏 我已经定义了lambda来执行断言检查。

Role role1=new Role();
role1.setAuthority("ADMIN");

Role role2=new Role();
role2.setAuthority("USER");

User user1=new User();
user1.setUsername("Ram");

User user2=new User();
user2.setUsername("Shyam");
user2.getRoles().add(role1);
user2.getRoles().add(role2);

role1.getUsers().add(user2);
role2.getUsers().add(user2);

session.beginTransaction();
session.save(user1);
session.save(user2);
session.save(role1);
session.save(role2);
session.getTransaction().commit();
int val1 = 0;
int val2 = 1;

const auto check = [val1,val2]()-> bool
{
    return val1 < val2;
};
// no error for this call
assert(check() && "Test is failed");

// no error for this call
assert([=]()-> bool
       {
           return val1 < val2;
       }() && "Test is failed");

为什么我要

  

为类似函数的宏调用提供了太多参数

当我使用assert宏并在捕获列表中定义带有多个参数的lambda时,

编译错误?

2 个答案:

答案 0 :(得分:7)

问题是捕获列表中的逗号。

预处理器对C ++语法的理解非常有限,它主要用于简单的文本替换。如果逗号不在匹配的内括号之间(当然不是字符串文字的一部分),则预处理器会将其视为宏调用的参数的分隔符。

因此预处理器认为你使用两个参数[this和第一个逗号后面的其他东西调用assert,这会产生错误。

您可以使用一组额外的括号来修复此错误:

int i = -7, j = 7;
assert(([i,j](){return i + j;}()));

对于标准爱好者:

  

由最外部匹配括号限定的预处理标记序列形成列表   函数式宏的参数。 列表中的各个参数用逗号分隔   预处理标记,但匹配内括号之间的逗号预处理标记不会分开   参数。如果参数列表中存在预处理标记序列,否则会出现这些序列   充当预处理指令,155行为未定义。

16.4 / 11在N4140中,强调我的。

答案 1 :(得分:2)

预处理器非常简单,它将所有逗号视为参数分隔符。

因此,如果您使用逗号作为宏的参数传入任何内容,则无法使用宏。