Вы можете добавить директиву в файл Bar.h, чтобы проверить, был ли файл уже включен:
#ifndef _BAR_H_INCLUDED_
// Bar.h not included - declare your structs, etc, here.
// Define _BAR_H_INCLUDED_ to indicate this file has already
// been included
#define _BAR_H_INCLUDED_ 1
#endif
Это должно как минимум помешать вам включить Bar.h
несколько раз.
РЕДАКТИРОВАТЬ
Лучшим решением может быть включение Bar.c
из Bar.h
:
// Bar.h
#ifndef _BAR_C_INCLUDED_
// code here
// Include Bar.c
#include "Bar.c"
#define _BAR_C_INCLUDED_
#endif
Затем вы можете просто включить Bar.h
в Foo.c
:
// Foo.c
#include <stdio.h>
#include <stdlib.h>
#include "Bar.h"
int main() {
//...
Затем скомпилировать:
gcc Foo.c -o Foo
Итак, вот ваш обновленный код - сначала Bar.h
#ifndef _BAR_C_INCLUDED_
typedef struct Foo Foo;
struct Foo {
int number;
} MYFOO = {2};
void helloWorld (void);
#include "Bar.c"
#define _BAR_C_INCLUDED_
#endif
Сейчас Bar.c
:
void helloWorld() {
printf("Hello world\n");
}
Наконец, Foo.c
- включите сюда stdio.h
, а также Bar.h
(что, в свою очередь, включает Bar.c
для нас):
#include <stdio.h>
#include "bar.h"
int main() {
helloWorld();
}
Идля компиляции:
gcc Foo.c -o Foo -Wall