C++中已定义的sz宏未被识别,提示size未声明错误的原因是什么?
问题原因与解决方案
你遇到的报错不是sz宏没有被正确识别,恰恰是宏正常展开后,展开结果里的size标识符没有找到对应的定义导致的,具体原因有两点:
- 你用到的
size是C++17才引入的标准库全局函数std::size,它的定义位于<iterator>头文件中,你当前的代码只引入了<iostream>和<vector>两个头文件,没有包含它的定义头,所以编译器找不到该标识符。 - 如果你使用的编译器默认编译标准低于C++17,就算引入了对应的头文件,也不会默认开启
std::size的特性支持,同样会触发找不到标识符的报错。
方案1(更推荐,兼容性更好)
直接修改sz宏的定义,改为调用容器本身的成员方法size(),不需要额外引入头文件也不依赖C++17标准:
// 把原来的 #define sz(x) (int)size(x) 替换为下面的写法 #define sz(x) (int)x.size()
方案2(保留原有宏定义)
如果要保留原来的size(x)写法,需要做两处修改:
- 在代码头部增加头文件引入:
#include <iterator> - 编译时指定C++17及以上的标准,例如使用GCC编译时增加编译参数
-std=c++17
内容的提问来源于stack exchange,提问作者Fanzhao Yin
相关产品推荐
相关产品推荐

