能否将结构体作为函数参数直接初始化?C语言struct使用疑问
问题解决:直接传递结构体初始化列表给函数报错
报错原因
printvector2({800, 600});的写法不符合C语法规范——直接的初始化列表不能作为函数实参传递,C语言要求实参必须是合法表达式,裸初始化列表不属于这类表达式。
解决方案:使用复合字面量
C99标准引入了复合字面量语法,可直接在函数调用中构造临时结构体对象,语法格式为(结构体类型){初始化列表}。
修改后的调用代码如下:
printvector2((vector2){800, 600});
完整示例代码
#include <stdio.h> typedef struct { int x, y; } vector2; void printvector2(vector2 v) { printf("x: %d\n", v.x); printf("y: %d\n", v.y); } int main() { // 直接通过复合字面量传递临时结构体 printvector2((vector2){800, 600}); // 也可指定成员名,提升代码可读性 printvector2((vector2){.x=1920, .y=1080}); return 0; }
注意事项
- 确保编译器支持C99或更高版本(主流编译器如GCC、Clang默认已支持),若使用老版本编译器,需手动开启C99编译模式,例如GCC添加参数
-std=c99。 - 复合字面量创建的临时对象会在当前表达式结束后销毁,但作为函数参数传递时,会先拷贝到函数形参中,不存在生命周期问题。
内容的提问来源于stack exchange,提问作者Artur Moszczyński
相关产品推荐
相关产品推荐

