redeclared with different access

在单元测试中,为了构造异常场景需要直接访问私有成员,经常使用的方法是:

#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 中指定。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值