跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
C 语言复合字面量
”︁
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
{{Note|本条目适用于C99及以上标准的C语言特性。传统K&R C或C89不支持此语法。}} = C语言复合字面量 = '''复合字面量'''(Compound Literals)是C99标准引入的特性,允许在表达式位置创建'''未命名'''的临时对象。其语法类似强制类型转换与初始化列表的组合,为结构体、数组等聚合类型提供了便捷的初始化方式。 == 基本语法 == 复合字面量的通用语法形式为: <syntaxhighlight lang="c"> (类型名){ 初始化列表 }; </syntaxhighlight> === 类型分类 === 复合字面量支持两种主要类型: ==== 1. 数组类型 ==== <syntaxhighlight lang="c"> // 创建int[3]数组 (int[]){1, 2, 3}; // 带部分初始化的字符数组 (char[]){'a', [2] = 'c'}; // 等价于 {'a', '\0', 'c'} </syntaxhighlight> ==== 2. 结构体/联合体类型 ==== <syntaxhighlight lang="c"> // 匿名结构体 (struct point){ .x = 10, .y = 20 }; // 带类型定义的联合体 typedef union { int i; float f; } num; (num){ .f = 3.14 }; </syntaxhighlight> == 生命周期与存储期 == 复合字面量的生命周期取决于其出现的位置: {| class="wikitable" |+ 存储期规则 ! 上下文位置 !! 存储期 !! 示例 |- | 函数体外 || 静态存储期 || <code>(int[]){1,2,3}</code> 全局可用 |- | 函数体内 || 自动存储期 || 离开作用域后失效 |} == 典型用例 == === 1. 函数参数传递 === 避免显式声明临时变量: <syntaxhighlight lang="c"> void print_coord(struct point p) { printf("(%d, %d)\n", p.x, p.y); } // 调用时直接构造参数 print_coord((struct point){ .x=100, .y=200 }); </syntaxhighlight> === 2. 动态初始化指针 === <syntaxhighlight lang="c"> int *arr = (int[]){10, 20, 30}; // 等价于静态初始化+取地址 </syntaxhighlight> === 3. 多维数组构造 === <mermaid> graph LR A[复合字面量] --> B[矩阵运算] A --> C[图形变换] A --> D[查表操作] </mermaid> 示例代码: <syntaxhighlight lang="c"> // 3x3矩阵乘法参数 matrix_multiply( (float[][3]){{1,0,0}, {0,1,0}, {0,0,1}}, (float[][3]){{2}, {3}, {4}} ); </syntaxhighlight> == 高级特性 == === 常量复合字面量 === 添加<code>const</code>限定符可创建只读对象: <syntaxhighlight lang="c"> const char *msg = (const char[]){"Hello"}; // 存储在.rodata段 </syntaxhighlight> === 与指针运算结合 === 复合字面量返回的是左值,可进行取地址操作: <syntaxhighlight lang="c"> int *p = &(int){42}; // p指向值为42的匿名int </syntaxhighlight> == 实际应用案例 == '''场景:图形渲染中的顶点数据传递''' <syntaxhighlight lang="c"> typedef struct { float x,y,z; } Vertex; void draw_triangle(Vertex v1, Vertex v2, Vertex v3) { // 渲染实现... } // 调用时直接构造顶点数据 draw_triangle( (Vertex){ .x=0, .y=0, .z=0 }, (Vertex){ .x=1, .y=0, .z=0 }, (Vertex){ .x=0.5, .y=1, .z=0 } ); </syntaxhighlight> == 注意事项 == * '''C++兼容性''':C++中需使用构造函数语法而非复合字面量 * '''宏定义中的使用''':需额外加括号避免语法歧义 * '''调试限制''':匿名对象在调试器中可能难以追踪 {{Warning|复合字面量在函数返回时返回指向栈内存的指针会导致未定义行为:}} <syntaxhighlight lang="c"> int *bad_example(void) { return (int[]){1,2,3}; // 错误!数组在函数返回后失效 } </syntaxhighlight> == 数学表达示例 == 当用于科学计算时,可结合向量运算: <math> \vec{v} = (float[3]) \{ x_1 + x_2, y_1 \cdot y_2, \sqrt{z} \} </math> == 总结 == 复合字面量通过减少临时变量声明使代码更简洁,但需特别注意其生命周期限制。合理使用可提升代码可读性,尤其在以下场景: * 临时聚合数据构造 * 只读查找表初始化 * 测试代码中的快速数据构造 {{See also|相关C语言特性}} * 指定初始化器(Designated Initializers) * 变长数组(VLAs) * 柔性数组成员(Flexible Array Members) [[Category:编程语言]] [[Category:C]] [[Category:C 语言高级特性]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)
该页面使用的模板:
模板:Mbox
(
编辑
)
模板:Note
(
编辑
)
模板:See also
(
编辑
)
模板:Warning
(
编辑
)
模块:Arguments
(
编辑
)
模块:Format link
(
编辑
)
模块:Hatnote
(
编辑
)
模块:Hatnote list
(
编辑
)
模块:Labelled list hatnote
(
编辑
)
模块:Message box
(
编辑
)
模块:Message box/ambox.css
(
编辑
)
模块:Message box/configuration
(
编辑
)
模块:Yesno
(
编辑
)