diff --git a/shared/src/main/scala/io/kaitai/struct/translators/CppTranslator.scala b/shared/src/main/scala/io/kaitai/struct/translators/CppTranslator.scala index 8218d50d6..f6da9ebe0 100644 --- a/shared/src/main/scala/io/kaitai/struct/translators/CppTranslator.scala +++ b/shared/src/main/scala/io/kaitai/struct/translators/CppTranslator.scala @@ -117,6 +117,16 @@ class CppTranslator(provider: TypeProvider, importListSrc: CppImportList, import override def doByteArrayLiteral(arr: Seq[Byte]): String = "std::string(\"" + Utils.hexEscapeByteArray(arr) + "\", " + arr.length + ")" + override def doByteArrayNonLiteral(values: Seq[Ast.expr]): String = { + // It is assumed that every expression produces integer in the range [0; 255] + if (config.cppConfig.useListInitializers) { + "std::string({" + values.map(value => s"(char)(${translate(value)})").mkString(", ") + "})" + } else { + // TODO: We need to produce an expression, but this is possible only with initializer lists + // or variadic templates (if use a helper function) which both available only since C++11 + throw new RuntimeException("C++ non-literal arrays are not implemented yet without list initializers") + } + } override def numericBinOp(left: Ast.expr, op: Ast.operator, right: Ast.expr) = { (detectType(left), detectType(right), op) match {