结构初始化C/C++编程语言?

Jic*_*hao 12 c c++ struct

我可以使用代码进行struct初始化:

struct struct_type_id struct_name_id = { value1, value2, value3 };
Run Code Online (Sandbox Code Playgroud)

但不能用:

struct struct_type_id struct_name_id;
struct_name_id = { value1, value2, value3 };
Run Code Online (Sandbox Code Playgroud)

为什么我可以用前者来做,但是后者不能用gcc,g ++,vc2008,vc6?换句话说,为什么c/c ++编程语言不支持这种语法?

谢谢.

Jul*_*ano 22

第一个语句创建一个初始化为给定值的变量,即这些值构建在内存中并直接存储在该变量地址中的程序可执行文件中(对于全局变量)或准备好进行内存复制(对于堆栈变量).

第二个块的第二个声明非常不同.虽然看起来很相似,但它是一个赋值表达式.这意味着equals运算符的RHS是一个被计算的表达式(独立于LHS中的=),然后传递给=运算符.没有适当的背景,{...}没有任何意义.

在C99中,您可以这样做:

struct_name_id = (struct struct_type_id){ value1, value2, value3 };
Run Code Online (Sandbox Code Playgroud)

现在,equals运算符的RHS是一个有效的表达式,因为编译器有适当的上下文来知道其中的内容{...}.

在C++ 11中,语法是:

struct_name_id = struct_type_id{ value1, value2, value3 };
Run Code Online (Sandbox Code Playgroud)

  • @jcyang:GCC可能允许这种语法,但它不是C89/C90(它是GCC扩展名).例如,MSVC,Digital Mars和Comeau不支持(除非你在Comeau中启用C99支持)支持该语法. (2认同)