我有两个类型"Company“和"User”,这两个类型都包含一个公共类型"Address",并且正在尝试生成cpp头文件。我尝试了多种方法,但最终在两个不同的头文件中重复定义了"Address“结构。avrogencpp是否可以为每种类型生成一个头文件,而不是将所有内容都放在一个文件中?
这就是我所能做到的:
1)创建sample.avdl
@namespace("test")
protocol Simple {
record Address {
string street;
string state;
string zip;
}
record Company {
string name;
Address address;
}
record Employee {
string firstName;
string lastName;
Address address;
}
}2)使用avro-tools生成模式文件:avro-tools idl2schemata sample.avdl
3)使用avrogencpp生成headers:
avrogencpp -i Address.avsc -o address.h
avrogencpp -i Employee.avsc -o employee.h
avrogencpp -i Company.avsc -o company.h现在,问题是employee.h和Comany.h都定义了struct Address,因此无法一起编译。
发布于 2021-03-30 09:33:56
avrogencpp不是一个聪明的程序,整个Avro的C++应用程序接口也不是很好的构思。对于正常的代码,几乎总是需要进行一些后期处理。
在这种情况下,最好的方法是编辑生成的company.h和employee.h文件:删除冗余代码( Address和codec_traits<Address>结构)并插入
#include "address.h"在顶部的包含项中。(实际上,您可以只用这一个替换生成的包含,因为每个生成的头文件都有相同的包含集。)
https://stackoverflow.com/questions/60344685
复制相似问题