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
不,除非编译器中存在错误.通常,静态函数代码没有用于在目标文件中导出函数的名称,因此它不会呈现给链接器,也不能链接到它.
这当然仅适用于按名称调用函数.同一文件中的其他代码可以获取函数地址并将其传递到另一个文件中的非静态函数,然后来自另一个文件的函数可以调用您的静态函数.
"访问"?这取决于你对这个术语的意思.我假设当你说"静态函数"时,你正在谈论声明的独立函数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
功能.我不知道这种访问是否符合您问题中的"访问权限".
归档时间: |
|
查看次数: |
11261 次 |
最近记录: |