как запретить другим модулям вызывать мою внешнюю функцию в c - PullRequest
0 голосов
/ 17 октября 2011

предположим, что моя программа состоит из нескольких слоев, скажем, Слой A и Слой B .Файл a_foo.c содержит определения моих функций, файл a_foo.h содержит объявления функций, соответствующие определениям в a_foo.c .

Мой замысел заключается в том, что модули одного слоя (в данном случае layer A ) могут вызывать функции, объявленные в a_foo.h , а Layer B не могу вызвать, хотя с a_foo.h в комплекте.

так как мне этого добиться?Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 17 октября 2011

Предположительно, у вас будет несколько (предпочтительно только несколько) функций на любом данном уровне, которые могут / будут взаимодействовать с другими уровнями.Большинство других используются только внутри этого слоя.

Инструмент 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.

1 голос
/ 17 октября 2011

Вы должны разделить два слоя на две вспомогательные библиотеки, расположенные в разных каталогах, и только общие заголовочные файлы каждого слоя в общем каталоге include. Таким образом, вы избежите случайного включения a_foo.h в слой B.

Если вам нужен более строгий контроль доступа, вам понадобится системно-зависимый хакер. Однако в большинстве случаев это очень не нужно.

...