我正在使用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时,为类似函数的宏调用提供了太多参数
编译错误?
答案 0 :(得分:7)
问题是捕获列表中的逗号。
预处理器对C ++语法的理解非常有限,它主要用于简单的文本替换。如果逗号不在匹配的内括号之间(当然不是字符串文字的一部分),则预处理器会将其视为宏调用的参数的分隔符。
因此预处理器认为你使用两个参数[this
和第一个逗号后面的其他东西调用assert,这会产生错误。
您可以使用一组额外的括号来修复此错误:
int i = -7, j = 7;
assert(([i,j](){return i + j;}()));
对于标准爱好者:
由最外部匹配括号限定的预处理标记序列形成列表 函数式宏的参数。 列表中的各个参数用逗号分隔 预处理标记,但匹配内括号之间的逗号预处理标记不会分开 参数。如果参数列表中存在预处理标记序列,否则会出现这些序列 充当预处理指令,155行为未定义。
16.4 / 11在N4140中,强调我的。
答案 1 :(得分:2)
预处理器非常简单,它将所有逗号视为参数分隔符。
因此,如果您使用逗号作为宏的参数传入任何内容,则无法使用宏。