错误:宏“断言”传递了 2 个参数,但只需要 1 个

Posted

技术标签:

【中文标题】错误:宏“断言”传递了 2 个参数,但只需要 1 个【英文标题】:error: macro "assert" passed 2 arguments, but takes just 1 【发布时间】:2021-10-31 01:50:25 【问题描述】:
vector<string> foo(vector<string> s)  return s; 
assert(foo(vector<string>"hello", "world") ==
         vector<string>"hello", "world");
错误:宏“assert”传递了 2 个参数,但只需要 1 个 错误:未在此范围内声明“断言”

也许在 gcc 11.1.0 中定义断言

#  define assert(expr)                          \
     (static_cast <bool> (expr)                     \
      ? void (0)                            \
      : __assert_fail (#expr, __FILE__, __LINE__, __ASSERT_FUNCTION))

编译器标志是

 -Wall -std=c++20

【问题讨论】:

【参考方案1】:

预处理器只对 C++ 的语法有一个原始的理解,特别是它把任何没有括在括号中的逗号作为参数分隔符。 assert 调用中有两个逗号,括号中只有一个,所以宏认为它得到了两个参数,如下所示

foo(vector<string>"hello", "world") == vector<string>"hello"
"world");

将表达式括在括号中以防止这种情况发生。

// Note: Double parens
assert((foo(vector<string>"hello", "world") ==
        vector<string>"hello", "world"));

【讨论】:

以上是关于错误:宏“断言”传递了 2 个参数,但只需要 1 个的主要内容,如果未能解决你的问题,请参考以下文章

宏 MOCK_METHOD 传递了 3 个参数,但 std::pair 仅出现 2 个错误

从 rexx 代码向 ispf 宏传递参数时出现无效长度错误

静态断言之一 assert 以及 通过宏定义处理文件包含关系

带有可选参数的 PHP 函数

JUnit的断言 Assert

如何使用uiRouter传递多个参数但只显示一个?