其他文件中的静态功能访问

Arp*_*pit 13 c c++ unix static gcc

是否有可能在文件范围之外评估静态函数.?

Alo*_*hal 20

这取决于你所说的"访问".当然,函数不能在任何其他文件中按名称调用,因为它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
Run Code Online (Sandbox Code Playgroud)


R S*_*hko 16

它可以通过函数指针从作用域外部调用.

例如,如果你有:

static int transform(int x)
{
    return x * 2;
}

typedef int (*FUNC_PTR)(int);

FUNC_PTR get_pointer(void)
{
    return transform;
}
Run Code Online (Sandbox Code Playgroud)

然后,作用域外的函数可以调用get_pointer()并使用返回的函数指针来调用transform.


sha*_*oth 12

不,除非编译器中存在错误.通常,静态函数代码没有用于在目标文件中导出函数的名称,因此它不会呈现给链接器,也不能链接到它.

这当然仅适用于按名称调用函数.同一文件中的其他代码可以获取函数地址并将其传递到另一个文件中的非静态函数,然后来自另一个文件的函数可以调用您的静态函数.


Jay*_*Jay 6

它的名称无法在文件外部访问.但是,你也可以将它分配给函数指针并在任何你想要的地方使用它.


AnT*_*AnT 5

"访问"?这取决于你对这个术语的意思.我假设当你说"静态函数"时,你正在谈论声明的独立函数static(即用内部链接声明)而不是C++中的静态类成员函数,因为后者可以从任何地方轻松地访问.

现在,声明的独立函数static具有内部链接.它不能任何其他翻译单元链接.或者,换句话说,它不能通过任何其他翻译单元的名称来引用.如果你的意思是"从文件范围之外访问",那么不,它就无法完成.

但是,如果其他翻译单元以某种方式得到一个指向该函数的指针(即如果你以某种方式允许该指针"泄漏"到ouside世界),那么任何人仍然可以通过进行idirect调用来调用该函数,从而"访问"它.例如,如果您声明

static void foo_static(void) {
}

extern void (*foo_ptr)(void) = foo_static;
Run Code Online (Sandbox Code Playgroud)

然后在用户能够做的任何其他翻译单元中

extern void (*foo_ptr)(void);
foo_ptr();
Run Code Online (Sandbox Code Playgroud)

并且呼叫将转到您的foo_static功能.我不知道这种访问是否符合您问题中的"访问权限".