# eoq **Repository Path**: qzcwxh/eoq ## Basic Information - **Project Name**: eoq - **Description**: eoq - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-03-30 - **Last Updated**: 2026-05-14 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 仓颉 # 官网 https://cangjie-lang.cn/ vscode安装插件后注意需要插件设置以下cangjie的sdk路径 # 编译去掉无用告警 cjc ./test.cj -o test -Woff unused cjpm.toml文件中可以配置优化选项 compile-option = "-Woff unused" 输出多行 用3个引号的,中间支持\n换行 用#的多行文字,\n只是当作2个普通字符 参数在函数内不可变,相变用全局变量别用参数,参数名加!可以有缺省值 6 chapter 循环和条件 chapter 8 计算长方体面积体积 比较大小 chapter 9 类内成员在其他类调用 包外只能访问public 包外子类可访问public和protected chapter 10 枚举 cjc ./enumtest.cj -o enumtest -Woff unused chapter 11 接口 cjc ./interface_demo.cj -o interface_demo -Woff unused 格式化 https://developer.huawei.com/consumer/cn/doc/cangjie-guides-V5/format_package_overview-V5 第12章 泛型 cjc ./generic_demo.cj -o generic_demo -Woff unused 第13章 包管理,太多文件的话可以分包 第14章 扩展,演示如何在不破坏封装的情况下,给已有的类型添加成员或者实现接口 cjc ./extend_demo.cj -o extend_demo -Woff unused 第15章 基础集合类型 cjc ./array_list_demo.cj -o array_list_demo -Woff unused 第16章 函数的进阶用法 函数作为参数 cjc ./function_demo.cj -o function_demo -Woff unused cjc ./index_operator_demo.cj -o index_operator_demo -Woff unused 2类操作符 cjc ./operators_overloading_demo.cj -o overload -Woff unused 函数作用域 cjc ./shadow_demo.cj -o shadow_demo -Woff unused 17章 查明类型 cjc ./operator_is_demo.cj -o operator_is_demo -Woff unused 周长 类型别名 cjc ./polymorphic_demo.cj -o polymorphic_demo -Woff unused 18章 联合表达式 异常 自定义异常 cjc ./coalescing_demo.cj -o coalescing_demo -Woff unused 19章 base64加密解密 注意默认数组下标是Int64 cjc ./base64_demo.cj -o base64_demo -Woff unused 最大整数 格式化显示小数 定制宽度字符或整数 hex输出 时间 一些数学函数 月份计算输出 随机数(注意种子用纳秒更靠谱) cjc ./constant_demo.cj -o constant_demo -Woff unused random 控制台输入输出 字符串转整形小数 cjc ./duration_demo.cj -o duration_demo -Woff unused 20 chapter 接受字符输入 字符查找 字符串拼接分割 取子字符串 去除首尾空白 21 chapter HashMap hashset 能统计元素个数 能判断元素是否存在 能删除元素 能遍历元素 能排序 cjc ./hashmap_demo.cj -o hashmap_demo -Woff unused 22 模式匹配 match (switch select) 匹配字符 枚举 根据分数匹配评语 元祖匹配(对象里部分字段一致即可算匹配)对象类型匹配 23 作用域 函数的高级用法,包括广泛使用的Lambda表达式以及闭包和函数调用语法糖。 cjc ./closure_demo.cj -o closure_demo -Woff unused 函数输出可以作为下一个函数输入 lambda 表达式用法 管道 也是一个函数输出可以作为下一个函数输入 24 同步 仓颉线程 并发编程数据 等子线程超时结果 终端子线程等输入 没有互斥锁和atom 最后多线程会访问同一个变量就会出现数据不一致的问题,反过来多线程访问同一个变量注意用互斥锁或atom引用。 多线程异常退出注意解锁,否则所有线程都无法继续了 所以synchronized关键字比lock更简介,能自动保证加解锁不用手动解锁 cjc ./atomic_demo.cj -o atomic_demo -Woff unused 25 文件处理,包括文件、目录的基础操作和文件读写的实现 cjc ./create_file_demo.cj -o create_file -Woff unused # 仓颉语言调用c的库 https://developer.huawei.com/consumer/cn/doc/cangjie-guides-V5/cangjie-c-V5 https://bbs.huaweicloud.com/blogs/437056 cangjie调用c的库,cjcallc.cj cjc ./cjcallc.cj -o cjcallc -Woff unused 调用c的库,需要在cangjie的sdk目录下找到对应的库文件,然后在cjcallc.cj中添加头文件和库文件路径,然后编译运行即可。 编译c库 gcc -fPIC -c pain.c # 编译源代码生成位置无关的代码对象文件 gcc -shared -o libpain.so pain.o # 将对象文件链接为动态链接库(.so文件) gcc -shared -o libpain.so -fPIC -c pain.c 如果编译可执行文件是pie格式,则需要加上-fPIE -pie参数 cjc -L . -l pain ./cjcallc.cj -o cjcallc -Woff unused # 仓颉语言代码编译成动态库 https://developer.huawei.com/consumer/cn/doc/cangjie-guides-V5/compile_options_ohos-V5 cjc tool.cj --output-type=dylib -o libtool.dylib -Woff unused cjc tool.cj --output-type=dylib -o libtool.so -Woff unused 可以将 tool.cj 编译成一个动态链接库,在 Linux 平台 cjc 会生成一个名为 libtool.so 的动态链接库文件。 新建一个paint.c 和libtool.so,然后编译运行即可。 gcc -o paint paint.c -L. -ltool LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH ./paint # 20251209 eoq cjc ./eoq.cj -o eoq -Woff unused 比如 ./eoq 6000 125 6 6000 125 6 https://cangjie-lang.cn/docs # 20260508 cangjie+gtk4 # 安装 GTK4 开发依赖 sudo apt install libgtk-4-dev cjc login.cj -o login_demo -lgtk-4 -lgobject-2.0 -lglib-2.0 后来发现行不通 vala语言和gtk4比较契合,vala是c的封装 sudo apt install -y libgtk-4-dev libglib2.0-dev valac valac login.vala -o login --pkg gtk4 再试cangjie和qt cjc login.cj -o login -Woff unused 创建项目 运行仓颉应用报库找不到loading shared libraries: libboundscheck.so: cannot open shared object file LD_LIBRARY_PATH=$HOME/program/cangjie/lib:$HOME/program/cangjie/runtime/lib/linux_x86_64_cjnative ./cj-gtk-app cjc helloworld.cj -o helloworld 修改bashrc文件 export LD_LIBRARY_PATH=/home/qzc/program/ipv6:${CANGJIE_HOME}/lib:${CANGJIE_HOME}/runtime/lib/linux_x86_64_llvm:${CANGJIE_HOME}/runtime/lib/linux_x86_64_cjnative:${CANGJIE_HOME}/tools/lib:/usr/lib/x86_64-linux-gnu/:${LD_LIBRARY_PATH} source ~/.bashrc 经过多轮摸索,可以cangjie+gtk4可以了 然后是界面布局 Glade设计界面只能gtk3,需要 gtk4-builder-tool 可把 GTK3 的 .ui 转成 GTK4 兼容版GTK 替代设计工具:Cambalache(原生支持 GTK4,导出标准 .ui) 准备 sudo apt install flatpak flatpak remote-add --user --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo 安装 flatpak install flathub ar.xjuan.Cambalache 启动 flatpak run ar.xjuan.Cambalache WSL 避坑(打不开时用) flatpak run --nosocket=wayland --env=GSK_RENDERER=cairo ar.xjuan.Cambalache # 消除 VSCode 中 gtk/gtk.h 波浪线的方法 打开 VSCode 命令面板 Windows/Linux: Ctrl + Shift + P Mac: Cmd + Shift + P 输入:C/C++: Edit Configurations (UI) 进入 c_cpp_properties.json 配置界面。 找到 Include path 在里面加入下面这行(直接复制): ${workspaceFolder}/** /usr/include/gtk-4.0 /usr/include/glib-2.0 /usr/lib/x86_64-linux-gnu/glib-2.0/include /usr/include/pango-1.0 /usr/include/harfbuzz /usr/include/cairo /usr/include/gdk-pixbuf-2.0 /usr/include/graphene-1.0 /usr/lib/x86_64-linux-gnu/graphene-1.0/include # 格式化界面文件 (可能不行) # 直接修改原文件(覆盖) gtk-builder-tool format --overwrite layout.ui # 将格式化后的内容输出到新文件 gtk-builder-tool format layout.ui > window.ui # 校验 sha256sum ./cangjie-sdk-linux-x64-1.1.0.tar.gz 5ce7e8c8523aad9cf5965f818249e1a39f10788963aef7c5852697a3ac964060 ./cangjie-sdk-linux-x64-1.1.0.tar.gz sha256sum ./cangjie-vscode-1.1.0.tar.gz 642a80eefe280f7789633d1827ebc5dbe27a68b6fa46f4431d8a656d8fd7d035 ./cangjie-vscode-1.1.0.tar.gz # 在 VS Code 中配置 SDK 路径 插件需要知道 SDK 的具体位置才能调用语言服务。 在 VS Code 中,按下 Ctrl+,(逗号)打开 设置。 在搜索框中输入 cangjie。 找到 Cangjie: Sdk Path (仓颉: SDK 路径) 这一项。 点击 "在 settings.json 中编辑" 或者直接在输入框中浏览文件夹,填入你刚才解压的 SDK 的 根目录路径。 settings.json 配置示例: { "cangjie.sdk.path": "C:\\cangjie\\173\\windows-x86_64-17.3.0-release" } # 编译提示Prefer variable 'content' to follow the principle of minimizing scope 变量应该在离它第一次使用的地方尽可能近的地方声明,并且它的作用域(生命周期)应该尽可能的小。 仓颉代码行尾不需要分号,多行代码写在一行才需要 # 通过 .desktop 文件启动你的程序(或者从系统菜单启动),而不是直接在终端运行二进制文件。这样 GTK 才能将其与“最近文件”系统正确关联。 总结原因 g_set_application_name: 只是设置了窗口标题和内部显示用的名字。 gtk_application_new: 设置了程序的 ID。 .desktop 文件: 告诉操作系统“ID 为 com.example.myapp 的程序长什么样、图标是什么、在哪里”。 只有这三者环环相扣,且通过 .desktop 启动时,操作系统才会将该程序打开的文件记录到“最近使用”列表中。 # git设置 git config --local user.name "qzchasee" git config --local user.email "qiaozhangchi@ewivt.com" # vscode自定义主题 ctrl+sift+p setting.json // 基础字体设置(可选,护眼通常搭配稍微大一点的字体) "editor.fontSize": 16, "editor.lineHeight": 1.6, "editor.fontFamily": "Consolas, 'Courier New', monospace", // 颜色自定义核心配置 "workbench.colorCustomizations": { // 编辑器区域 "editor.background": "#C7EDCC", "editor.foreground": "#333333", "editor.lineHighlightBackground": "#b8dec0", "editor.selectionBackground": "#8ec296", // 侧边栏 "sideBar.background": "#C7EDCC", "sideBar.foreground": "#333333", // 活动栏(最左侧) "activityBar.background": "#C7EDCC", "activityBar.foreground": "#333333", // 标题栏 "titleBar.activeBackground": "#C7EDCC", "titleBar.activeForeground": "#333333", // 状态栏 "statusBar.background": "#C7EDCC", "statusBar.foreground": "#333333", // 面板(终端、输出等) "panel.background": "#C7EDCC", "terminal.background": "#C7EDCC" } # 用cjpm管理项目编译 cjpm init