Предположительно, у вас будет несколько (предпочтительно только несколько) функций на любом данном уровне, которые могут / будут взаимодействовать с другими уровнями.Большинство других используются только внутри этого слоя.
Инструмент C предоставляет для этого static
- несколько функций, которые должны быть видны внешнему миру (так сказать):extern
и прототип в шапке.Остальные static
.Это означает, что их имена видны только внутри этого TU, поэтому никто больше не может их вызывать или даже видеть.
// a_foo.c
static void internal_function1(whatever_args) { }
static void internal_function2(whatever_args) { }
void external_function1(args) { /* this code can use internal_function* */ }
// f_foo.h
void external_function1(args);
Что касается всего, что находится за пределами a_foo.c, имена internal_function1
и internal_function2
не существует вообще.Они совершенно невидимы.Даже если бы мы включили для них прототипы в a_foo.h, внешний код все равно не мог бы их вызывать или вообще их видеть.
Это, однако, единственный инструмент, предоставляемый C.Что бы это ни было, оно работает довольно хорошо, , но , если код слоя A достаточно велик, чтобы вы захотели распределить его по нескольким исходным файлам, вещи торопятся - C предоставляет только двауровни видимости: либо один исходный файл, либо все исходные файлы.Там нет промежуточного уровня, чтобы сказать, что он должен быть виден в исходных файлах A, B и C, но не D, E или F.