Skip to content

模块常量与 #常量 引用 ​

[🕒 预计 10 分钟] | 难度:入门

模块除了对外提供命令,还可以像易语言的「模块常量表」一样封装命名常量。模块作者把常量写进模块清单,用户在源码里用 #常量名 直接引用,不需要再自己抄一遍键码、版本号这类数字和文本。

1. 解决什么问题 ​

没有模块常量时,类似的值只能靠魔法数字或每个项目自己重复定义:

python
键盘_按下(13)          # 13 是什么?要翻文档才知道是回车键

有了模块常量,语义由模块官方维护,项目直接引用:

python
键盘_按下(#回车键)      # 与模块命令配套的官方常量,可读、可补全、可悬停

2. 在源码中引用:#常量名 ​

#常量名 是常量的规范引用形态(裸标识符,不带引号),与 &处理器、@ 内嵌 C++ 并列为三种前缀语义之一:

python
类 常量演示窗口 : 窗口
公开
  事件 _常量演示窗口_创建完毕()
    调试输出(格式化文本("{} v{}", #软件名称, #版本号))   // #软件名称、#版本号 来自项目常量表
    键盘_按下(#回车键)                                   // #回车键 来自已启用模块的常量表
  结束
结束
  • 敲入 # 会立即呼出常量专用补全(新手模式与专业模式一致),回车/Tab 上屏,不会重复插入 #。
  • 补全项带来源标注,可以区分常量来自哪个模块或来自项目。
  • #常量 在编辑器中有独立的紫色语义着色,与字符串、变量、关键字明显区分。
  • 悬停 #常量名 可查看类型、取值和模块作者的中文说明。

3. 常量从哪来:项目常量 + 启用模块常量 ​

来源定义位置说明
项目常量项目的「项目全局变量」文件中的常量表本项目自己定义
模块常量模块清单 contributes.constants[]随模块安装/启用自动进入所有项目

同名时:项目常量遮蔽模块常量(以项目定义为准,生成代码里只保留一份)。如果两个已启用模块公开了同名常量,属于硬冲突,构建前会给出中文阻断诊断,提示为常量名加模块前缀规避。

4. 查看模块带了哪些常量 ​

  • 模块检查器 → 模块详情:启用模块后,详情面板展示其公开常量、类型、取值与说明。
  • 编辑器里敲 #:补全项标注常量所属来源(哪个模块或项目),一眼分辨。
  • 标记为 advanced(高级)级别的常量,只有在开启高级 API 后才会进入补全,默认只显示 basic 常量。

5. 常见问题与诊断 ​

现象原因与处理
#xxx 报「常量不存在」常量所在模块已安装但未启用:诊断会指明启用路径,到模块检查器启用该模块即可;或该项目/模块确实没有这个常量
给 #常量 赋值报错常量是只读的,需要可变值请改用普通变量
构建被「同名常量冲突」阻断两个启用模块公开了同名常量,禁用其中一个,或联系模块作者为常量名加前缀
字符串、注释或 @ 内嵌 C++ 行里的 # 被误认为常量?不会。字符串、注释、多行文本块与 @ 行内的 # 一律不按常量解析

6. 模块作者:怎么封装常量 ​

在模块清单 v2 的 contributes.constants[] 中声明,每项包含名称、类型、字面量取值与中文说明:

json
{
  "name": "键盘1",
  "type": "整数型",
  "value": 49,
  "description": "数字键 1 的虚拟键码,配合 键盘_按下 等命令使用。",
  "level": "basic"
}
  • type 目前开放基础类型:整数型、长整数型、字节型、小数型、双精度小数型、文本型、逻辑型;value 必须是纯字面量,不支持表达式。
  • name 由中文、字母、数字、下划线组成,不能以数字开头,声明时不带 #。
  • 常量必须同步写入模块中文文档(contributes.docs[]),说明取值含义和配合哪些命令使用。

完整的清单字段与校验门禁以随 IDE 分发的《模块开发手册》「公开常量」一节为准;模块工程从零创建或从 .lbmod 解开可参考站内「新建与打开模块」,封装流程另见「用 AI 生成模块」与「调用 C++ DLL」。

7. 生成与导出行为 ​

构建或导出 Visual Studio 工程时,启用模块常量与项目常量一起被物化为 C++ 编译期常量(数值型生成 inline constexpr,文本型生成 inline const std::wstring),统一放入生成的全局命名空间;导出的工程可直接在 Visual Studio 中打开阅读,常量值一目了然。