В книге K&R (стр. 59) (редактирование: второе издание, охватывающее ANSI C) предполагается, что большие проекты проще разбивать на несколько файлов. В каждом файле, как обычно, вверху включены несколько библиотек: например. getop.c нуждается в stdio.h, а также в stack.c и main.c.
Фрагменты примерно такие:
//main.c
#include <stdio.h>
#include <stdlib.h>
#include "calc.h"
int main(void)
{
//etc
}
//getop.c
#include <stdio.h>
#include <ctype.h>
#include "calc.h"
getop()
{
/*code*/
}
//stack.c
#include <stdio.h>
#include "calc.h"
void push(double val)
{
//code
}
Мне трудно понять, как работает включение стандартных библиотек несколько раз в проект. Конечно, чтобы пользовательские файлы .c могли получить доступ к встроенным функциям, нам нужно включить #include <header.h>
, чтобы они знали о существовании printf()
и getchar()
и т. д., но не увеличит ли этот подход размер файла конечная программа, если stdio.h
включается четыре раза вместо одного (если бы все помещалось в один файл)?
K&R отмечает, что разделение программы на несколько файлов в конечном итоге усложняет поддержку всех файлов .h.
Я полагаю, что на самом деле я спрашиваю, как компилятор решает проблему включения одной библиотеки в проект несколько раз.
Я читал об использовании include guards, но кажется, что это не нужно для этой реализации, поскольку они обеспечивают, чтобы идентичные фрагменты кода не включались дважды, как в:
Файл "module.h"
#ifndef MODULE_H
#define MODULE_H
struct foo {
int member;
};
#endif /* MODULE_H */
Файл "mod2.h"
#include "module.h"
Файл "прог.с"
#include "module.h"
#include "mod2.h"