QBS中如何实现多行字符串 寻求简洁无hack的实现方案
QBS 多行字符串实现方案
以下方案均为QBS原生支持的标准写法,无hack、无冗余转义,适配QBS底层的ES5版本QML JS引擎:
方案1:外置独立模板文件(最适合API设计场景)
对于固定的大段代码片段,最优做法是不要把内容硬编码在QBS脚本的字符串中:
- 将C++代码片段存为独立的模板文件(例如和.qbs脚本同目录的
sneed.tpl.cpp) - 直接通过QBS内置的File API读取文件内容即可,完全不需要处理转义、换行问题:
codeblock(x, "cpp", File.read("sneed.tpl.cpp"));
该方案实现了构建逻辑和模板内容的完全解耦,模板文件可以直接按C++语法正常编辑,没有嵌套语法的干扰,可维护性最高。
方案2:数组拼接法(适合短片段/动态生成内容)
如果代码片段较短,或者需要动态插入变量,使用ES5标准支持的数组join写法即可,不需要行尾转义,也不依赖非标准特性:
codeblock(x, "cpp", [ 'union Seed;', 'union Feed', '{', ' int operator+( Feed & ) { return 0 ; };', ' QString operator+( Seed & ) { return "feed"; };', '};', 'union Seed', '{', ' int operator+( Feed & ) { return 1 ; }', ' QString operator+( Seed & ) { return "seed"; }', '};', 'template<typename T0, typename T1> auto sneed() {', ' T0 p;', ' T1 q;', ' return p + q;', '}' ].join('\n'));
该写法全版本QBS兼容,换行可以完整保留,代码结构清晰,没有任何黑魔法。
之前尝试的方案问题说明
- 反引号模板字符串是ES2015新增语法,QBS依赖的QML JS引擎基于ES5实现,不支持该特性,因此会抛出
Unexpected token错误。 - 字符串末尾加
\的续行语法,仅支持将单行字符串拆分为多行书写,不会在拼接位置自动插入换行符,因此最终输出会挤成无换行的一整行。 - 函数注释提取
toString()的写法属于非标准hack:JS规范未强制要求函数toString()输出必须保留注释内容,不同引擎实现存在差异,不适合在正式的API逻辑中使用。
内容的提问来源于stack exchange,提问作者Anon
相关产品推荐
相关产品推荐

