OfficialKaldi(八)——Kaldi的编码样式(翻译注解)
当开始编码Kaldi工具箱的最终版本时,我们决定将OpenFst用作C ++库。
为了与OpenFst保持一致,我们决定在大多数方面使用相同的编码样式。
通过查看代码,可以明显看出Kaldi编码样式的许多方面。关键点包括:
- 标记命名规则,例如MyTypeName,MyFunction,my_class_member_var_,my_struct_member,KALDI_MY_DEFINE,kGlobalConstant,kEnumMember,g_my_global_variable,my_namespace,my-file.h,my-file.cc,my-implementation-inl.h
- 控制函数参数的规则:无非常量引用;输入先于输出。
- 空格和格式的规则:每行最多80个字符(必要时除外),在与功能相同的行上带有大括号;请参阅其他空格约定的代码。
- I / O:我们使用C ++风格的I / O,并在对象的I / O例程上有特定的约定(请参阅
- Kaldi I / O机制
- )。
- 函数参数:我们不允许引用参数为非常量(使用指针),iostream除外。输入必须在功能参数列表中的输出之前。
- 错误状态通常由异常指示(有关特定机制,请参见
- Kaldi日志记录和错误报告
- )。
- 对于“普通”整数,我们尝试使用int32。这是因为在知道整数类型的二进制大小时,最容易使用Kaldi的二进制I / O机制(
- Kaldi I / O机制
- )。
- 对于“常规”浮点值,我们使用BaseFloat,它是一个typedef(如果您使用KALDI_DOUBLEPRECISION = 1进行编译,则它是double,否则是float)。这样可以更轻松地以双精度测试算法并检查差异。但是,我们始终对累加器使用double。
- 我们在所有#define前面加上KALDI_,以避免将来与其他代码库发生冲突(因为#define不受名称空间保护)。除了在名称空间fst中的OpenFst扩展之外,所有的kaldi代码都在名称空间kaldi中。
- 带有一个参数的类构造函数必须使用“ explicit”关键字(这可以防止不必要的类型转换)。
- 我们通常避免使用复制构造函数和赋值运算符(有一个KALDI_DISALLOW_COPY_AND_ASSIGN会禁用C ++提供的“默认”值)。
- 除非STL算法要求,否则我们将避免运算符重载。
- 我们通常避免函数重载,而是使用不同的名称。
- 我们使用static_cast 之类的C ++样式强制转换,而不是(int)之类的C样式强制转换
- 我们尽可能使用const。
Google C ++样式指南的例外情况包括:
- 我们使用iostream,并且允许将对iostream的非常量引用传递给函数(这违反了no-non-const-references规则)。
- 对于get / set方法,假设类成员名为x_,则Google风格的get和set方法将为x()和set_x()。但是,按照OpenFst编码样式,我们将它们称为X()和SetX():例如Mean()和SetMean()。这个特殊的规则是新的。过去,我们采用的方法不一致,我们将更改代码以使其符合标准。
萍水相逢逢萍水,浮萍之水水浮萍!