gpt4 book ai didi

c - 声明的顺序对于结构来说并不重要?

转载 作者:行者123 更新时间:2023-11-30 18:32:02 25 4
gpt4 key购买 nike

#include <stdio.h>
#include <stdlib.h>
void f(struct emp);
struct emp{
char name[20];
int age;
};
int main(){
struct emp e = {"nikunj", 23} ;
f(e);
return 0;
}

void f(struct emp e){
printf("%s %d\n", e.name, e.age);
}

运行上面的代码会出现以下错误

nikunjbanka@ubuntu:~$ gcc hello2.c -o main.out
hello2.c:3:15: warning: ‘struct emp’ declared inside parameter list [enabled by default]
hello2.c:3:15: warning: its scope is only this definition or declaration, which is probably not what you want [enabled by default]
hello2.c: In function ‘main’:
hello2.c:10:2: error: type of formal parameter 1 is incomplete
hello2.c: At top level:
hello2.c:14:6: error: conflicting types for ‘f’
hello2.c:3:6: note: previous declaration of ‘f’ was here

但是《测试你的C技能》一书说,程序中原型(prototype)声明和结构声明的顺序并不重要。我想问一下顺序重要不重要?

最佳答案

是的,顺序绝对重要。

重新排序代码,使 struct emp 的定义出现在 f 的函数原型(prototype)之前。

#include <stdio.h>
#include <stdlib.h>

struct emp{
char name[20];
int age;
};

void f(struct emp);

...

gcc 实际上试图告诉您,您执行的操作顺序错误,但是如果这是您第一次阅读编译器消息,它们会有点令人困惑。

这两个警告:

hello2.c:3:15: warning: ‘struct emp’ declared inside parameter list [enabled by default]
hello2.c:3:15: warning: its scope is only this definition or declaration, which is probably not what you want [enabled by default]

表明在 gcc 编译文件的第 3 行时,“struct emp”的类型未知。编译器通常会尝试推断未知的 struct emp 的默认类型和大小,并且几乎总是错误地猜测,因为它不知道您最终将如何声明 struct emp。

此错误:

hello2.c:10:2: error: type of formal parameter 1 is incomplete

表示您尝试使用实际参数类型调用函数“f”,该类型与 gcc 在编译文件第 3 行时(错误地)推断出的形式参数类型不同。

此错误和相关注释:

hello2.c:14:6: error: conflicting types for ‘f’
hello2.c:3:6: note: previous declaration of ‘f’ was here

表示第 14 行的形式参数类型(现在已知是您在第 4 行到第 7 行声明的类型 struct emp)与 gcc 的形式参数类型不匹配(再次错误) ) 在第 3 行推断。

底线:在引用它们的原型(prototype)之前定义所有类型,应该没问题。

如果您使用,您可能还会发现代码更具可读性

typedef struct {
char name[20];
int age;
} emp_t;

然后您可以在后续代码中使用 emp_t 而不是 struct emp

关于c - 声明的顺序对于结构来说并不重要?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17627233/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com