模块常量与 #常量 引用
[🕒 预计 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 中打开阅读,常量值一目了然。