C-声明静态的函数的链接

cha*_*rre 7 c static scope

声明为static的函数和变量具有内部链接,它们具有文件范围,并且对于其他文件中的函数不可见.

假设我声明了这样的函数: -

  static int foo(int i);
Run Code Online (Sandbox Code Playgroud)

在一个名为file1.c的文件中我可以通过使用指针从其他文件file2.c访问此函数.

我正在阅读一本书,其中写道它可以完成,但我不知道这是怎么可能的.

这些是确切的行: -

因为它具有内部链接,所以不能直接从定义它的文件外部调用foo.(将foo声明为静态并不能完全阻止它在另一个文件中被调用;通过函数指针的间接调用仍然是可能).

小智 6

也许您正在寻找这个?

// file1.h
extern void (*fptr)(void);

// file1.c
static void foo(void)
{
    printf("Hello world!\n");
}

void (*fptr)(void) = &foo;  //or void (*fptr)(void) = foo;

// file2.c
#include "file1.h"

fptr();
Run Code Online (Sandbox Code Playgroud)

这里,foo是静态的,但它的地址是通过非static全局变量引用的。这是完全有可能的。