变量声明完成后一次性构造变量initialization/definition

Structure variable initialization/definition in one go after variable declaration is done

是否可以在声明或定义后一次性定义结构体变量?全部放在单括号中,例如

asd = {21,'H'};

任何特殊原因如果无法完成,因为它可以在声明它的同一行中定义,例如:struct asd = {21,'H'}; ?

struct test
{
    int a;
    char b;
}asd;  

asd = {21,'H'};   // error: expected an expression

要求进行 C 编程。

需要显式类型转换:

struct test
{
    int a;
    char b;
} asd;  

asd = (struct test){21,'H'};

此代码大致等同于以下代码:

const struct test initialiser = {21,'H'};
... 
asd = initialiser;

不同之处在于编译器可以选择使用具有立即值的汇编程序指令来优化对 asd 变量的赋值,而这种优化比 const 结构复制初始化更有效。

作为 'side' 效果,此语法在 CC++

中均有效
struct test
{
    int a;
    char b;
}asd; 

structtesttest类型的变量asd的定义。在 ; 处,您现在有一个名为 asd 的默认构造对象。当你尝试做

asd = {21, 'H'};

您正在尝试对 asd 和括号列表进行赋值,这将不起作用,因为它没有采用初始化列表的赋值运算符。

你可以像

这样声明时初始化asd
struct test
{
    int a;
    char b;
}asd = {21, 'H'}; 

或者像

一样做作业
asd = (struct test){21, 'H'};

如果您选择使用赋值,请注意它必须在函数内部完成,而不是在全局 space.

正如@CaptainOblivious 提到的:

–aggregate initialization is different from assignment.

这意味着您以后不能在聚合对象的赋值中使用聚合初始化,而不是显式或单独的,如下所示:

struct test
{
    int a;
    char b;
}asd; 
int main() {asd.a = 21; asd.b = 'H'}

另一种做法是稍后明确(这需要在 main 或另一个代码块中完成,否则会出现错误 (asd does not name a type)):

asd = test{21,'H'}

您可以做的另一件事是:

struct test
{
    int a;
    char b;
}asd = {21,'H'};

以上两种方法都可以,如下所示: Live Example

如果您要定义该类型的变量,则必须包括 struct 部分,例如 struct asd。但是这个定义和初始化一起工作得很好。

struct test
{
    int a;
    char b;
} asd = { 21, 'H'};