воскресенье, 12 июня 2011 г.

Использование структуры определённой в др. файле

  Как известно, в языке C управлять областью видимости глобальных переменных и функций следует с помощью ключевого слова static - если они объявлены как static, то область их видимости ограничивается  c-файлом, в котором они определены, в противном же случае они могут быть доступны во всех c-файлах, в которых объявлены с помощью ключевого слова extern  (не путать объявление с определением).


  Допустим, что изначально у меня имеются такие c-файлы:

Файл a.c:


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
//файл a.c
#include<stdio.h>
/*глобальная переменная и функция
ОПРЕДЕЛЕНЫ без модификатора static,
следовательно к ним, посредством
extern можно получить доступ из др.
c-файлов.
*/
char ch[] = "Hello World\n";
void mymsg(){
printf("I like C lang.\n");
}

Файл b.c:

 

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
//файл b.c
#include<stdio.h>
/*
С помощью ключевого слова extern ОБЪЯВЛЯЮ
переменную и функцию, определённые в файле
a.c. Только после этого их можно будет
использовать в текущем c-файле.
*/
extern char ch[];
extern void mymsg();
int main(){
printf("Message: %s", ch);
mymsg();
return 0;
}

Компилирую исходники и запускаю результирующий файл на исполнение:
bush@mycomp:~/training/c/c89/mytests$ gcc a.c b.c -o d.out
bush@mycomp:~/training/c/c89/mytests$ ./d.out
Message: Hello World
I like C lang.
bush@mycomp:~/training/c/c89/mytests$
  Как видим - всё отработало нужным образом. Давайте теперь изменим файлы исходного кода... 
  В файл a.c - добавим определение некоторой структуры customer, а в файл b.c добавим функцию, которая должна работать с объектом этой структуры.

  Для того, чтобы в файле b.c можно было использовать структуру, объявленную в др. файле, этот файл должен быть файлом заголовка. Т.о. нам следует переименовать файл a.c в файл a.h, не забыв при этом подключить его через #include к файлу b.c, а так же не забыв удалить из кода файла b.c присутствовавшие в нём ранее объявления для глобальной переменной ch, и для функции mymsg - они более не нужны, т.к. искомые объекты теперь находятся не в c-файле, а в подключенном h-файле.
  Итак, теперь наши файлы будут иметь такое содержимое:
Файл a.h:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
//файл a.h
#include<stdio.h>
char ch[] = "Hello World\n";
void mymsg(){
printf("I like C lang.\n");
}
struct customer {
char *name;
int age;
};//Не забываем про ';'!!!

Файл b.c:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
//файл b.c
#include<stdio.h>
#include"a.h"
int main(){
printf("Message: %s", ch);
mymsg();
struct customer mycust;
mycust.name = "Andrey";
mycust.age = 33;
void mymsg2(const struct customer cust);
mymsg2(mycust);
return 0;
}
void mymsg2(const struct customer cust){
printf("%s, %d\n", cust.name, cust.age);
}
  Компилирую исходники и запускаю результирующий файл на исполнение:
bush@mycomp:~/training/c/c89/mytests$ gcc b.c -o d.out
bush@mycomp:~/training/c/c89/mytests$ ./d.out
Message: Hello World
I like C lang.
Andrey, 33
bush@mycomp:~/training/c/c89/mytests$
  Как видим - код работает так, как мы и ожидаем.

Комментариев нет: