【问题标题】:Initializing a struct variable via compound literal — issues compiling?通过复合文字初始化结构变量 - 编译问题?
【发布时间】:2021-03-19 10:04:34
【问题描述】:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct {
  char name[20];
  int favoriteNum;
} person;

int main(){

  person Gec = {"Gec", 1000};  //initialize var Gec of type struct person
  Foo = (person) {"Foo", 7};  //initialize var Foo of type struct person

  printf("%s's favorite number is %d.\n", Gec.name, Gec.favoriteNum);
  printf("%s's favorite number is %d.\n", Foo.name, Foo.favoriteNum);

  return 0;
}

得到

“错误:使用未声明的标识符 'Foo'”。

会不会是我的版本不支持使用复合文字?还是我做错了什么?语句person Gec = {"Gec", 1000}; 在功能上是否与Gec = (person) {"Gec", 1000}; 相同?在实验室作业中看到了这一点,但没有详细解释。

【问题讨论】:

  • Foo = (person) {"Foo", 7}; --> person Foo = (person) {"Foo", 7}; 编译器没有神奇的方法来计算变量类型,你必须提供它。
  • Foo 仍然需要用类型声明。与 C++ 和其他一些支持这种“魔法”的语言不同,C 不会从对象的初始值设定项类型推断对象的类型。
  • 这里有关于compound literals的很好的教程
  • “在实验室作业中看到了这个,但没有详细解释。” 您需要找到它,并将其添加到问题中,因为它没有说出你认为它说的话。在某些语言中,第一次使用标识符时会推断类型,并且可以更改与标识符关联的类型。在 C 中,您必须在声明标识符时为每个标识符显式指定类型,并且该类型不能更改。

标签: c struct compiler-errors initialization


【解决方案1】:

以下语句将person 类型的复合文字的值分配给名为Foo 的变量:

Foo = (person) {"Foo", 7};

不幸的是,在您的程序中,当编译器遇到此语句时,还没有声明 Foo。由于这是一种语言违规,因此编译失败。

有多种方法可以解决此问题。但是,如果您的意图是观察复合文字赋值的工作,而不是初始化(已经用 Gec 说明),那么您可以简单地在赋值上方添加 Foo 的声明。

person Foo;
Foo = (person) {"Foo", 7};

【讨论】:

    猜你喜欢
    • 2018-04-26
    • 1970-01-01
    • 1970-01-01
    • 2010-11-10
    • 1970-01-01
    • 2021-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多