C语言中的静态函数真的不可见吗?

Neh*_*ary 3 c

我被告知,无法从其他文件访问static在一个.c文件中定义的函数.但是在下面的程序中,我可以static void show()从另一个文件访问该函数.我对staticC 中函数的理解是错误的吗?

啊(第一档):

static void show()
{
printf("I am in static show function in a.c");
}
Run Code Online (Sandbox Code Playgroud)

bc(另一个文件):

#include"a.h"
void main()
{
show();
}
Run Code Online (Sandbox Code Playgroud)

Oli*_*rth 11

请记住,#include通过复制和粘贴包含文件的内容来工作.因此,在您的示例中,在#include处理完之后,您会得到:

static void show()
{
printf("I am in static show function in a.c");
}

void main()
{
show();
}
Run Code Online (Sandbox Code Playgroud)

所以很明显main可以看到show.1

解决方案是不是 #include .c文件.通常,您应该只有#include标题(.h)文件.不应在头文件中声明或定义静态函数,因此main无法查看它.


但是,你现在实际上有两个show函数的定义,一个在a.c和一个b.c.对于static函数,这不是问题,但对于非static函数,您将收到链接器错误.

  • @NehaChoudhary:好的,我已经看到了你的最新问题.问题是你在头文件中定义了一个函数,你不应该这样做.函数定义放在源文件中.您分别编译每个源文件,然后将结果与链接器组合.如果您告诉我们您正在使用哪些工具进行编译,我们可以告诉您如何执行此操作. (2认同)

Alo*_*ave 6

static关键字将链接规范更改为内部链接.
标记为的功能static仅在该翻译单元(TU)中可见.

也许,您在该特定TU中可以使用相同的命名符号,您可以在其中访问该功能.只有在向我们展示代码后才能回答它的部分内容.

编辑:
当你static在头文件中定义一个函数时,在你包含它的每个翻译单元中创建一个相同函数的副本.这个函数的每个实例都被视为一个单独的函数(每个函数的地址是不同的),每个这些函数的实例有自己的static局部变量和字符串文字的副本.

显然,这将起作用,但这可能会增加生成的二进制文件的大小.