2015-12-15 2 views
2

у меня есть три файла, как например:Расщепление основной файл в модули в C

module.c:

void bar() { 
    foo(); 
} 

module.h: (я не ставил включаемые охрану для простоты)

void bar(); 

main.c

void foo() { 
    //some code 
} 
int main() { 
    bar(); 
} 

при ком piling main.c и module.c, module.c возвращает ошибку, поскольку foo() не определен. Как я могу это исправить? В принципе, я хотел взять мой фактический главный файл, который был довольно большим, и разделить его части на другие файлы для удобства чтения, но эти функции вызывают другие функции, найденные в главных

+1

Это противоречит дизайну модулей. Модуль не должен знать о 'foo', если' main.c' зависит от этого модуля. Или разделите 'foo' на другой модуль или сделайте его частью' module.c'. – paddy

+0

Создайте 'main.h' и добавьте в него декларацию для' foo', так же, как вы сделали с 'bar'. –

ответ

2

Это сложно из-за указаний, по которым ваши зависимости идут.

я могу разделить ваш код на три единицы компиляции: main.c, module.c и foo.c

Если вы сделаете это, вы не имеете никакого кода Foo в основном, основной вызывает только бар , а bar включает foo, который определен в foo.

main.c

#include "module.h" 

int main() { 
    bar(); 
} 

module.c

#include "foo.h" 

void bar() { 
    foo(); 
} 

foo.c

void foo() { 

} 

Лучше всего это то, что вам не нужно объявлять Foo вне обув .h, или bar вне модуля.h.

+0

Единственное, что я хотел бы добавить к этому, это рассмотреть вопрос о том, нужна ли 'foo' за пределами' module.c'. Если это внутренняя функция, которая имеет смысл только в 'module.c', тогда нет никаких оснований предоставлять ее в любых заголовках. Вместо этого он может быть реализован в этом файле как статический. – paddy

-1

определений Put прототипа для всех вашего функции в module.h:

int main(int argc,char **argv); 
void foo(void); 
void bar(void); 
int fludger(int abc,char *str); 

вы получаете дополнительное преимущество, что в дополнении к положить любую функцию в любом .c файл, который вы хотите, вам больше не нужно заказывать функции в пределах данного файла .c, основанных на что называет то, что [например до этого, если Foo называется, бар должен быть определен выше Foo]

+4

Почему бы вам прототип 'main'? – paddy

+0

@paddy сила привычки. это не наносит вреда, и поскольку я использую perl-скрипт для автоматического создания этих прототипов для своих собственных вещей, это не особый случай для main. –

+0

На самом деле, я голосую за это. Прототипирование 'foo' в' module.h' и реализация в 'main.c' не является хорошей практикой. Заголовок должен описывать функции, которые предоставляются его исходным файлом.Он не должен описывать функции, предоставляемые _other_ исходными файлами. Этот ответ кажется салазком, чтобы «заставить его работать», а не объяснять, почему исходный код имеет сломанный дизайн. – paddy

1

Я думаю module.h может также определить void foo(); таким образом module.c будет осуществлять foo тоже. С другой стороны, если bar косвенно зависит от foo, то, возможно, module.c должен включать another_module.h, реализованный another_module.c.

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