GCC11.1.0 C++20环境下assert宏参数不符及未声明报错排查
报错产生原因
- 宏参数拆分错误
C/C的宏处理发生在预处理阶段,早于C语法语义分析,宏解析参数时只会根据逗号和小括号配对规则拆分参数,不会识别大括号、初始化列表等C++语法结构的边界。
你传入assert的表达式中,vector<string>{"hello", "world"}初始化列表里的逗号不在小括号范围内,被预处理器识别为宏参数的分隔符,导致原本的1个表达式被拆成2个参数传入只接受1个参数的assert宏,触发第一个报错。 - 缺少头文件包含
assert是定义在<cassert>(C++标准头文件)或<assert.h>(C兼容头文件)中的宏,如果你没有在代码开头包含对应头文件,就会触发第二个找不到声明的报错。
解决方法
- 给
assert的入参加一层额外的小括号,让预处理器将整个表达式识别为单个参数,避免被逗号拆分:
// 修改后写法 assert( (foo(vector<string>{"hello", "world"}) == vector<string>{"hello", "world"}) );
你也可以先将比较结果存入临时bool变量再传给assert,同样可以避免该问题:
bool res = foo(vector<string>{"hello", "world"}) == vector<string>{"hello", "world"}; assert(res);
- 在代码开头添加头文件引入:
#include <cassert>,解决assert未声明的问题。
内容的提问来源于stack exchange,提问作者MengSen
相关产品推荐
相关产品推荐

