2015-08-13 2 views
0

Я пытаюсь понять, как написан код ядра, следуя основам 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? Какую цель он выполняет в программе, чтобы написать имя структуры в каком-либо месте и объявить ее другим местом?

ответ

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 объявляет новую структуру, которая скрывает объявление структуры с одно и то же имя во внешнем пространстве. Это разные структуры.

+0

Так что, если я объявляю объект в каком-либо файле .h, и программист читает об этом, он может написать другое определение. Так как это полезно? Как увеличивается читаемость? –

+0

@Mlo Bootloader Определения структуры могут быть очень большими. Вы можете поместить определение структуры в отдельный заголовок. Но другим заголовкам иногда нужно знать, что такое объявление структуры существует, чтобы объявить, например, функцию. Таким образом, им нужно найти имя тега структуры, чтобы объявить функцию. –

+0

Итак, если структура необходима локально, декларация не требуется. Если структура используется по всему проекту, мы должны объявить ее в определенном файле .h и включить ее. Этот файл .h должен содержать этот файл .h, который содержит определение этой структуры. Итак, в ядре объявляются структурные переменные, определенные таким образом? –

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, что он может не зная его определения.

Смежные вопросы