在 c 中使用 struct 时未知的类型名称

Unknown type name when using struct in c

我的目标是使用 struct 创建一个菜单管理器程序,我的想法是从一个学生管理程序中得到的。这是我的几行代码:

#include<stdio.h>

typedef struct food{
    char foodname[111];
    char description[703];
    float price;
};

void add(food &food){
    float p;
    printf("Name: "); scanf("%110[^\n]", food.foodname);
    fflush(stdin);
    printf("Description: "); scanf("%702[\^n]", food.description);
    fflush(stdin);
    do{
        printf("Price: "); scanf("%lf", &food.price);
        p = food.price;
        if(p<=0){
            printf("Price should not be smaller or equal zero !\n");
        }
    } while (p<=0);
    printf("Added !");
}

int main(){
    food food1;
    add(food food1);
}

原代码的所有者有一个关于它的视频和代码 运行 很顺利,所以我实际上只是改变了一些东西,比如变量名、结构名和 printf 中的内容。但是,它显示了 2 个错误。 1 是

处的“&”标记之前的“预期的‘)’”
void add(food &food){...}

并且 2 是“未知类型名称 'food',使用 'struct' 关键字来引用

处的类型
food food1;

第二个错误可以通过添加 'struct' 轻松修复,但我了解到通过使用 typedef,我们可以删除该语法。我在这里做错了什么?顺便说一句,我有 运行 原始代码,它显示了相同的错误。我使用的是 gcc 9.2.0 64 位,而所有者 运行 gcc 4.9.2 64 位上的代码,这是主要原因吗?

您有两个个问题。

首先是typedef struct food{ ... };无效

typedef 的语法是

typedef actual_type type_alias;

在你的情况下,actual_type 是整个 struct food { ... } 部分,所以你需要做:

typedef struct food {
    // ...
} food;

这应该在任何像样的书、教程或 class 中清楚地展示。


第二个问题是您试图通过 reference 将参数传递给 add,这是 C++ 中不存在的特定于 C++ 的功能。

在 C 中,您只能模拟 通过引用传递,使用指针和 pointer-to 运算符来获取指向您传递的变量的指针。

您需要执行以下操作:

void add(food *food_ptr)
{
    // Dereference the pointer food_ptr to get the object it points to
    // For example:
    float p = food_ptr->price;

    // ...
}

然后将其命名为:

food f;
add(&f);  // Pass a pointer to the structure object f

虽然这可能比其他错误更晦涩,但好的资源也应该对此有解释。


最后,你其实还有一个错误...

C 规范明确提到将 input-only 流(如 stdin)传递给 fflush 函数会导致 未定义行为

不幸的是,一个编译器将其添加为 C 语言的 non-standard 和 non-portable 扩展。使用它是一个坏习惯,你应该学会不使用它。

你需要想出一些其他的方法来刷新输入直到换行。

此外,使用 scanf 读取行确实不是任何有经验的 C 程序员推荐的。请改用 fgets,并删除可能的尾随换行符。