在 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
,并删除可能的尾随换行符。
我的目标是使用 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
,并删除可能的尾随换行符。