在单元测试中,为了构造异常场景需要直接访问私有成员,经常使用的方法是:
#define private public
结果编译遇到下面的错误:
/usr/include/c++/10/sstream:312:7: error: 'struct std::__cxx11::basic_stringbuf<_CharT, _Traits, _Alloc>::__xfer_bufptrs' redeclared with different access
312 | struct __xfer_bufptrs
| ^~~~~~
这种宏定义的方式,改变了private的作用范围,会导致其他头文件中的private被重定义。(https://stackoverflow.com/questions/47839718/sstream-redeclared-with-public-access-compiler-error)
解决方案:
增加编译选项:
devel/bazel build --cxxopt=-fno-access-control //fuzztest/wave_fuzz:fuzztest_main
或者在BUILD文件中,需要忽略访问控制的binary中增加copts
copts = ["-fno-access-control"],
更改 --copt 设置会强制重新编译所有受影响的对象文件。另请注意,特定 cc_library 或 cc_binary 构建规则中列出的 copt 值将放置在编译器命令行中,位于这些选项之后。
应在 --cxxopt 而非 --copt 中指定特定于 C++ 的选项(例如 -fno-implicit-templates)。同样,C 专用选项(例如 -Wstrict-prototypes)应在 --conlyopt(而不是 copt)中指定。同样,仅在链接时产生影响的编译器选项(例如 -l)应在 --linkopt 中指定,而不是在 --copt 中指定。