Статическая функция доступа в другие файлы

13
задан Arpit 2 February 2010 в 08:08
поделиться

8 ответов

Это зависит от того, что вы подразумеваете под «доступом». Конечно, функция нельзя вызывать по имени в любом другом файле, поскольку в другом файле [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
20
ответ дан 1 December 2019 в 17:17
поделиться

Нет, если только в компиляторе нет ошибки. Обычно статический код функции не помечен именем, используемым для экспорта функции в объектном файле, поэтому он не представляется компоновщику и просто не может на него ссылаться.

Это, конечно, относится только к вызову функции по имени. Другой код внутри того же файла может получить адрес функции и передать его в нестатическую функцию в другом файле, а затем функция из другого файла может вызвать вашу статическую функцию.

12
ответ дан 1 December 2019 в 17:17
поделиться

После стандарта статическая функция не может быть доступна вне области применения файла по имени , потому что он подвержен внутренней связи. Это имя не экспортируется, а не предусмотрено линкером. Однако он все еще может быть доступен и называется указателем функции, как и любая другая функция.

4
ответ дан 1 December 2019 в 17:17
поделиться

Только с обманом. Функция, как правило, не видна компоновщику, поэтому она не позволяет это сделать.

Но, если Вы предоставите функцию внутри того же компилятора (как и статическую функцию), которая вернет адрес этой функции:

В 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
3
ответ дан 1 December 2019 в 17:17
поделиться

Нет, цель статического ключевого слова - это ограничить объем имени функции в файл.

1
ответ дан 1 December 2019 в 17:17
поделиться

Лучше, чем использовать 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 () и использовать указатель возвращенной функции для вызова преобразования.

16
ответ дан 1 December 2019 в 17:17
поделиться

Невозможно получить доступ к нему за пределами файла по его имени. Но вы также можете назначить его указателю функции и использовать его где угодно.

6
ответ дан 1 December 2019 в 17:17
поделиться

"Доступно"? Это зависит от того, что вы подразумеваете под этим термином. Я предполагаю, что когда вы говорите «статическая функция», вы имеете в виду автономную функцию, объявленную 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 . Я не знаю, квалифицируется ли такой доступ как "доступ" в вашем вопросе.

5
ответ дан 1 December 2019 в 17:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: