Доступ к статической функции в других файлах
Есть ли вероятность, что функция Static может быть оценена вне области файла.
Ответы
Ответ 1
Это зависит от того, что вы подразумеваете под "доступом". Конечно, функция не может быть вызвана по имени в любом другом файле, так как она static
в другом файле, но у вас есть указатель на нее.
$ cat f1.c
/* static */
static int number(void)
{
return 42;
}
/* "global" pointer */
int (*pf)(void);
void initialize(void)
{
pf = number;
}
$ cat f2.c
#include <stdio.h>
extern int (*pf)(void);
extern void initialize(void);
int main(void)
{
initialize();
printf("%d\n", pf());
return 0;
}
$ gcc -ansi -pedantic -W -Wall f1.c f2.c
$ ./a.out
42
Ответ 2
Он может быть вызван извне области с помощью указателя функции.
Например, если у вас есть:
static int transform(int x)
{
return x * 2;
}
typedef int (*FUNC_PTR)(int);
FUNC_PTR get_pointer(void)
{
return transform;
}
то функция вне области видимости может вызвать get_pointer() и использовать возвращаемый указатель функции для преобразования вызова.
Ответ 3
Нет, если в компиляторе нет ошибки. Обычно статический функциональный код не помечен именем, используемым для экспорта функции в объектный файл, поэтому он не представлен компоновщику, и он просто не может ссылаться на него.
Это, конечно, относится только к вызову функции по имени. Другой код в том же файле может получить адрес функции и передать его в нестационарную функцию в другом файле, а затем функция из другого файла может вызвать вашу статическую функцию.
Ответ 4
К нему нельзя получить доступ за пределами имени файла. Но вы также можете назначить его указателю на функцию и использовать его там, где хотите.
Ответ 5
"Accessed"? Это зависит от того, что вы подразумеваете под этим термином. Я предполагаю, что когда вы говорите "статическая функция", вы говорите об автономной функции, объявленной static
(т.е. Объявленной с внутренней привязкой), в отличие от статических функций-членов класса в С++, поскольку последние являются объектно и легко доступны из любого места.
Теперь автономная функция, объявленная static
, имеет внутреннюю привязку. Он не может быть связан с какой-либо другой единицей перевода. Или, говоря иначе, его нельзя назвать по имени из любой другой единицы перевода. Если это то, что вы подразумеваете под "доступом извне области файла", то нет, это невозможно.
Однако, если другие единицы перевода каким-то образом получают указатель на эту функцию (т.е. если вы каким-то образом позволяете этому указателю "просачиваться" в мир ouside), то кто-то все еще может вызвать эту функцию, совершив прямой вызов и, таким образом, доступ ". Например, если вы объявляете
static void foo_static(void) {
}
extern void (*foo_ptr)(void) = foo_static;
то в любой другой единицы перевода пользователь сможет выполнить
extern void (*foo_ptr)(void);
foo_ptr();
и вызов перейдет к вашей функции foo_static
. Я не знаю, квалифицируется ли такой тип доступа как "доступ" в вашем вопросе.
Ответ 6
Следуя стандарту, статическая функция не может быть доступна за пределами области файла по имени, поскольку она подвержена внутренней привязке. Это имя не экспортируется и не предоставляется компоновщику. Тем не менее, его все еще можно получить и вызвать по указателю функции, как и любую другую функцию.
Ответ 7
Только с обманом. Функция, как правило, не видна компоновщику, поэтому она не позволит вам это сделать.
Но если вы предоставляете функцию внутри одного и того же модуля компиляции (как статическая функция), которая возвращает адрес этой функции:
В main.c
:
#inclde <stdio.h>
int (*getGet7(void))(void);
int main (void) {
int (*fn)(void) = getGet7();
printf ("Result is: %d\n", fn());
return 0;
}
В hidden.c
:
static int get7 (void) {
return 7;
}
int (*getGet7(void)) (void) {
return get7;
}
Это приведет к вызову статической функции get7
.
pax> gcc -o demo main.c hidden.c ; ./demo
Result is: 7
Ответ 8
Нет, цель ключевого слова static - ограничить область имени функции файлом.