You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 09:33:29