C语言自定义类型默认值问题:为何C++可行C却报错?
问题原因解析:C与C++结构体默认成员初始化的差异
这其实是C和C++两种语言在结构体语法支持上的核心差异导致的,咱们来具体拆解清楚:
C++支持结构体成员默认初始化,C语言不支持
你代码里的结构体定义:typedef struct __POINT { int x = 0, y = 0; } Point;这里给
x和y直接设置=0的默认值,是C++11及以后版本才引入的特性(非静态数据成员默认初始化)。C编译器能识别并正确处理这种写法,所以你改成C代码后可以正常运行。C语言的结构体语法限制
而任何版本的C语言标准(C99、C11、C17等)都不允许在结构体定义阶段给成员变量直接赋值默认值。在C里,结构体成员的初始化只能在两个时机:- 定义结构体变量时,通过初始化列表赋值,比如
Point p = {0, 0}; - 动态分配内存后(比如用
malloc),像你代码里那样手动给成员赋值x->x = 5;
所以当你用C编译器编译带默认值的结构体定义时,编译器会把
int x = 0判定为语法错误,直接报错无法编译;而移除默认值后,结构体定义完全符合C的语法规范,自然就能正常编译运行了。- 定义结构体变量时,通过初始化列表赋值,比如
内容的提问来源于stack exchange,提问作者philips_dvd




