【问题标题】:compilation error in c struct variable assignmentc struct变量赋值中的编译错误
【发布时间】:2025-12-30 13:00:15
【问题描述】:

struct变量赋值有疑问。

struct udata
{
    char name[50];
    int num;
    char ch;
};

void main()
{
    struct udata a = {"ram", 20, 'a'};
    struct udata b;
    //b = {"ashok", 10, 'c'}; - illegal
    b = a;
}

在上面的代码中b = {"ashok", 10, 'c'}; 给出了编译错误,但它接受了b = a;。我希望两者都是类似的任务,但我不知道为什么它不接受第一个任务。有人可以解释一下为什么会这样吗?

注意:我正在使用 fedora gcc 编译器进行编译。

【问题讨论】:

    标签: c struct variable-assignment


    【解决方案1】:

    初始化器只能在声明时使用。如果你想在声明后初始化b,那么你可以通过使用复合文字来做到这一点——C99 特性:

    b =  (struct udata){"ashok", 10, 'c'};  
    

    GCC 还支持将复合文字作为extension

    【讨论】:

      【解决方案2】:

      您尝试做的事情不能直接在标准 C 中完成。最好的标准和可移植解决方案是使用临时:

      const struct udata tmp = {"ashok", 10, 'c'};
      b = tmp;
      

      但是,在实践中,编译器通常(但不总是!)允许以下内容(*注意如下):

      b = (struct udata){...};
      

      (* 注意:我相信至少 MSVC 不支持这种语法,可能还有很多其他语法;但只是把它扔在那里。然而,GCC,确实支持它)

      【讨论】:

        【解决方案3】:

        这就是 C 的设计和指定方式。你无能为力。如果您有结构变量,则只能通过声明中的初始化程序或稍后初始化各个成员来初始化它。


        以后,当发布有关编译器错误的问题时,请在问题中包含完整且未经编辑的错误日志。

        【讨论】: