我试图了解内核代码的编写方式,遵循C基础知识。 我有时会遇到这种情况,(fs.h)
struct backing_dev_info;
struct export_operations;
struct hd_geometry;
struct iovec;
我做了一个简单的C程序
#include <stdio.h>
struct bdinfo;
struct bdinfo{
int a;
int b;
};
int main()
{
struct bdinfo var;
var.a= 3 ;
var.b = 5 ;
printf("var.a = %d var.b = %d\n", var.a, var.b);
return 0;
}
有效。我需要理解为什么struct bdinfo 是以这种方式编写的,还是在fs.h文件中编写的?它在一个程序中用于在某个地方写入结构名称并将其声明为另一个地方的目的是什么?
答案 0 :(得分:2)
此记录
struct bdinfo;
是没有定义的结构声明。如果尚未声明,它会在给定范围内引入新类型声明。
当精确的结构定义不重要时,可以使用它。例如,它可以在函数声明中使用
struct bdinfo f( struct bdinfo parm1, struct bdinfo parm2 );
或在指针声明中。例如
struct bdinfo *p;
当细节不隐藏主要内容时,它使标题更具可读性。
此记录
struct bdinfo{
int a;
int b;
};
是结构声明,同时是结构定义。当需要确切的结构定义时,它是必需的。
例如
struct bdinfo s = { 10, 20 };
此声明要求知道结构定义。否则编译器无法确定初始化是否正确。
考虑到在给定范围内可能存在多个结构声明且只有一个结构定义。所以你可以写一些例如
struct bdinfo;
struct bdinfo{
int a;
int b;
};
struct bdinfo;
另一方面,如果有以下代码
struct bdinfo;
struct bdinfo{
int a;
int b;
};
{
struct bdinfo;
//...
}
然后blcok作用域中的结构声明声明了一个新结构,该结构隐藏了外部作用域中具有相同名称的结构声明。它们是不同的结构。
答案 1 :(得分:0)
如果您愿意,可以隐藏实现。例如:
# foo.h
struct mystr;
struct mystr *foo();
int bar(struct mystr*);
# foo.c
#include <stdlib.h>
#include "foo.h"
struct mystr {
int a;
int b;
};
struct mystr *foo() {
struct mystr *s = malloc(sizeof(*s));
s->a = 1;
s->b = 2;
return s;
}
int bar(struct mystr *s) {
return s->a;
}
# bar.c
#include "foo.h"
int main(void) {
struct mystr *a = foo();
return bar(a);
}
在这里,bar.c
能够使用指向struct mystr
的指针,而无需真正了解其定义。
请注意,这取决于使用指针。如果我们有,例如:
# foo.h
struct mystr;
struct mystr foo();
int bar(struct mystr);
然后bar.c
将无法使用foo
和bar
,因为它需要处理struct mystr
个对象,因为它需要知道对象的大小struct mystr
,它不能不知道它的定义。