Давайте предположим, что я пишу некоторые функции в файл, который мы будем называть foo.c
.
Это foo.c
:
int d;
typedef int bar;
int foo(int a, int b){
...
}
void boo(){
...
}
char *test(){
...
}
Теперь, boo - это функция, используемая только внутри foo.c, тогда как foo()
, test()
, d
и Bool
должны быть в состоянии вызываться внутри других файлов.
Чтобы сделать это, я знаю, что должен создать файл foo.h
и написать его так:
extern int d;
extern typedef int bar;
int foo(int a, int b);
char *test();
затем #include "foo.h"
в файле foo.c
, и всякий раз, когда я хочу использовать типы и функции, определенные в foo.c, я должен включать и foo.h
, и foo.c
в файл, в котором я хочу использовать Функции и типы foo.c.
Так что foo.c
в итоге будет выглядеть так:
#include "foo.h"
int d;
typedef int bar;
int foo(int a, int b){
...
}
void boo(){
...
}
char *test(){
...
}
Вот мои вопросы.
Q1. Это то, как вы на самом деле это делаете? Поскольку foo.h
уже включен в foo.c
, не будет ли достаточно включить только foo.c
в файл, в котором я хочу использовать его функции? Разве я не могу просто напрямую определить функции внутри файла foo.c, вообще не используя файл foo.h?
Q2. Вы действительно должны поместить extern
перед typedefs в файле foo.h
?
Q3. Допустим, в foo.c
я использую некоторые стандартные библиотеки C, такие как string.h и math.h. Где я должен включить их? Прямо в файле foo.c
, в файле foo.h
или в обоих? #ifndef
инструкции необходимы? Если да, то как вы их правильно используете?
Q4. После записи файлов foo.c
и foo.h
я все готов к работе? Мол, мне не нужно их компилировать или что-то еще, верно? Я могу просто #include
их где угодно, просто так?
В5. Где-то еще я читал, что если я хочу использовать пользовательскую библиотеку, мне нужно выполнить следующие шаги:
- определить интерфейс (
foo.h
)
- запись
foo.c
# включая foo.h
- создание объектного файла, подобного этому
gcc -o foo.o -c foo.c
- включая
foo.h
в программе, в которой я хочу использовать foo.c
функции
- связывание объектного файла следующим образом
gcc my_proj.c foo.o
Эти шаги действительно необходимы? Потому что я не видел, чтобы они упоминались где-либо еще. Почему мне нужно только включить foo.h
в файл, в котором я хочу использовать foo.c
функции? Что такое объектный файл?
Спасибо за ваше время и извините, если это немного долго