Это зависит от того, что вы подразумеваете под «доступом». Конечно, функция нельзя вызывать по имени в любом другом файле, поскольку в другом файле [11244446]
в другом файле, но у вас есть указатель функции.
$ 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
Нет, если только в компиляторе нет ошибки. Обычно статический код функции не помечен именем, используемым для экспорта функции в объектном файле, поэтому он не представляется компоновщику и просто не может на него ссылаться.
Это, конечно, относится только к вызову функции по имени. Другой код внутри того же файла может получить адрес функции и передать его в нестатическую функцию в другом файле, а затем функция из другого файла может вызвать вашу статическую функцию.
После стандарта статическая функция не может быть доступна вне области применения файла по имени , потому что он подвержен внутренней связи. Это имя не экспортируется, а не предусмотрено линкером. Однако он все еще может быть доступен и называется указателем функции, как и любая другая функция.
Только с обманом. Функция, как правило, не видна компоновщику, поэтому она не позволяет это сделать.
Но, если Вы предоставите функцию внутри того же компилятора (как и статическую функцию), которая вернет адрес этой функции:
В 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
Нет, цель статического ключевого слова - это ограничить объем имени функции в файл.
Лучше, чем использовать reset hard HEAD, после фиксации всех ваших действительных hunks, вы можете просто получить извлечение файла, чтобы сбросить его к тому, что записано в текущей ветви. Таким образом, это не влияет на другие файлы.
-121--3190190-Возможно, это не чувствовать себя в безопасности из-за волшебства, происходящего за кадром. Среда выполнения C и/или сама ОС активно отслеживает память, возвращаемую malloc, включая ее размер и местоположение. Хотя кажется, что вы передаете безтипный указатель обратно на свободный (), вы фактически передаете назад ссылку на объект, который активно отслеживает менеджер памяти.
-121--1477903-Его можно вызвать из-за пределов области с помощью указателя функции.
Например, если у вас было:
static int transform(int x)
{
return x * 2;
}
typedef int (*FUNC_PTR)(int);
FUNC_PTR get_pointer(void)
{
return transform;
}
, то функция за пределами области может вызвать get_pointer () и использовать указатель возвращенной функции для вызова преобразования.
Невозможно получить доступ к нему за пределами файла по его имени. Но вы также можете назначить его указателю функции и использовать его где угодно.
"Доступно"? Это зависит от того, что вы подразумеваете под этим термином. Я предполагаю, что когда вы говорите «статическая функция», вы имеете в виду автономную функцию, объявленную static
(т.е. объявленную с внутренней связью), в отличие от статических функций-членов класса в C ++, поскольку последние очевидно и легко доступны из любого места. .
Теперь автономная функция, объявленная static
, имеет внутреннюю связь. Его нельзя связать с из какой-либо другой единицы перевода. Или, говоря иначе, он не может быть отнесен к по имени из любой другой единицы перевода. Если это то, что вы имели в виду под «доступом извне файловой области», то нет, это невозможно.
Однако, если другие единицы перевода каким-то образом получат указатель на эту функцию (т.е.если вы каким-то образом позволите этому указателю «просачиваться» во внешний мир), тогда любой может вызвать эту функцию, сделав вызов idirect и, таким образом, «получить доступ» к ней. Например, если вы объявите
static void foo_static(void) {
}
extern void (*foo_ptr)(void) = foo_static;
, тогда в любой другой единице трансляции пользователь сможет выполнить
extern void (*foo_ptr)(void);
foo_ptr();
, и вызов пойдет в вашу функцию foo_static
. Я не знаю, квалифицируется ли такой доступ как "доступ" в вашем вопросе.