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

C23标准新增#embed预处理指令的作用是什么?

C23标准新增#embed预处理指令的设计目的

C23新增的#embed是原生的资源嵌入预处理指令,核心是解决C语言长期以来在资源嵌入上的痛点,具体设计目的如下:

替代繁琐的非标准化资源嵌入流程

过去要把二进制资源(比如图标、配置数据、自定义格式的二进制块)嵌入程序,只能依赖第三方工具(比如objcopy、xxd)把文件转换为C数组定义,或是手动编写冗长的十六进制字节列表。这些步骤不仅繁琐,还存在跨平台兼容性问题。#embed让编译器直接处理目标资源文件,自动生成对应的常量数据初始化代码,完全不需要额外的构建步骤。

比如下面的示例,直接通过指令嵌入图标文件,编译器会自动把文件内容转换为unsigned char数组的初始化列表:

// 嵌入小型图像资源。

#include <stddef.h>

void show_icon(const unsigned char *, size_t);

int main (int, char*[]) {
    static const unsigned char icon_data[] = {
#embed "black_sheep.ico"
    };
    show_icon(icon_data, sizeof(icon_data));
    return 0;
}

支持灵活的常量初始化场景

#embed不止能初始化数组,还可以遵循C语言的常规初始化规则,直接用嵌入的二进制数据初始化基本类型、结构体等非数组类型,大幅扩展了资源嵌入的适用场景:

int main() {
    /* 根据常规初始化规则,大括号可保留或省略 */
    int i = {
#embed "i.dat"
    }; /* i的值为[0, 2^(嵌入元素宽度))范围内的第一个条目 */
    int i2 =
#embed "i.dat"
    ; /* 当i.dat生成1个值时有效,i2的值为[0, 2^(嵌入元素宽度))范围内 */
    struct s {
        double a, b, c;
        struct { double e, f, g; };
        double h, i, j;
    };
    struct s x = {
        /* 按照初始化规则,用大括号内逗号分隔的整数常量表达式列表依次初始化每个元素 */
#embed "s.dat"
   };
   return 0;
}

比如示例中用单个值的文件初始化int变量,或是用对应格式的二进制数据填充结构体成员,无需手动适配数据结构,让资源嵌入更灵活。

保证代码的跨平台可移植性

此前的资源嵌入方案要么依赖特定编译器的扩展语法,要么绑定第三方工具,换个编译环境就需要调整适配。#embed是C23标准定义的指令,所有符合标准的编译器都会提供支持,写出的代码在不同平台、不同编译器下都能正常工作,彻底消除了平台差异带来的适配成本。

提升代码整洁度与开发效率

直接在代码中通过#embed引用资源文件,无需维护额外的转换脚本,也不用在代码里保留冗长的十六进制数据块,代码结构更清晰,同时减少了手动转换可能引入的错误,大幅提升开发效率。


内容的提问来源于stack exchange,提问作者chqrlie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 07:35:21