Cap'n 原型生成的 c++ 源代码无法编译
Cap'n proto generated c++ source doesn't compile
我对这段capnp代码有问题:
struct Result(Success, Error) {
union {
success @0 :Success;
error @1 :Error;
}
}
我创建并编译了c++源代码,如下所示:
capnp compile -oc++ test.capnp
g++ -o test.capnp.o test.capnp.c++ `pkg-config --cflags capnp` -std=c++11
和我得到这个相同的错误(和相同的错误,而不是成功)在多个位置在生成的头文件:
error: type/value mismatch at argument 2 in template parameter list for ‘template<class Success, class Error> struct Result’
KJ_IREQUIRE(which() == Result<Success, Error>::SUCCESS,
^
error: expected a type, got ‘true’
error: expected primary-expression before ‘>’ token
KJ_IREQUIRE(which() == Result<Success, Error>::SUCCESS,
^
error: ‘::SUCCESS’ has not been declared
KJ_IREQUIRE(which() == Result<Success, Error>::SUCCESS,
^
这是g++抱怨的一个定义:
template <typename Success, typename Error>
inline ::capnp::ReaderFor<Success> Result<Success, Error>::Reader::getSuccess() const {
KJ_IREQUIRE(which() == Result<Success, Error>::SUCCESS,
"Must check which() before get()ing a union member.");
return ::capnp::_::PointerHelpers<Success>::get(
_reader.getPointerField(0 * ::capnp::POINTERS));
}
我真的不明白为什么g++不接受这个…
我使用capnproto 0.5.3(第一次遇到这个问题是在0.5.2,然后更新,看看是否有帮助)和g++ 4.9.2。
这个答案的其余部分已经过时了。
从capnp 0.6.0版本开始,这个问题应该不再出现了。就在我写完问题的时候,我也想用clang测试一下,它实际上让我找到了错误。我还是选择把这个问题贴出来,因为我已经写完了。问题是KJ_IREQUIRE
是一个宏,而宏是预处理器处理的东西,它们的语义非常丑陋。Result
模板参数中的逗号被解释为宏的参数分隔符,这在g++中导致了这个非常无用的错误消息,但在clang中却是一个好得多的错误消息。
要解决这个问题,可以在KJ_IREQUIRE
的参数周围添加另一组括号。我希望这一点文档可以帮助别人!
相关文章:
- 在Linux中哪里可以找到互斥、未来等的源代码
- 如果编译的源代码是特定于它编译的硬件的,我们如何分发它
- 使用cmake从源代码构建MySQL连接器/C++失败(与以前的声明冲突)
- 难以理解某些人解决IOI问题的源代码
- 使用g++编译hdf5源代码
- 如何使用C++读取另一个程序中的源代码输出
- Poco FindMySql.cmake 无法找到 MySQL 源代码
- 更改命令行 qt5 源代码构建配置的正确/快速方法
- C++出现控制台错误.我无法识别源代码的问题
- Qt Quick,如何更改 Ui 源代码?
- 使用 Git 处理 C++ Visual Studio 2019 解决方案的外部依赖项源代码管理的最佳方法是什么?
- 从macOS Catalina上的源代码编译LLVM(如何解决未找到"stdio.h")
- 如何使用QT创建器获取网页源代码?
- 从源代码构建 gRPC C++
- 如何使用我构建的库,而不会从源代码出错,但不为我自己的项目编译?
- 如何在使用 LLVM 编译时获取部分源代码的二进制代码
- 如何在源代码中包含外部库的头文件?
- 如何查找 torch.bmm 的 c++ 源代码 pytorch.
- 是否有可能使用debug_info获取ELF文件的源代码?
- 为什么Qt必须从源代码构建以进行交叉编译?