为什么在 C 中使用静态函数?
Why use static functions in C?
我在这个线程上阅读了 C 中的静态函数:
据我了解,基本上你定义静态函数的地方是唯一可以调用它的 "place"/文件(fileA.c 即),这有点使这个函数 "private" 到那个 .c 或 .h 文件(或翻译单元)。但是如果你#include这个文件在其他一些(fileB.c)你仍然可以在那里使用它?
所以我试图了解在哪种情况下您希望该函数对于它自己的 .c 是静态的,以及如果您仍然可以通过仅包含其中的文件来使用该 "private"/static 函数,它是如何有意义的它被定义了。
此外,据我了解,如果您不包含定义了某些函数的其他文件,您将无法 use/call 那个函数,对吗?
换句话说,我只是无法理解静态函数的典型用例是什么,以及它与非静态函数的基本区别。
C 中的静态函数通常用于分离接口及其实现。它们扮演对接口的客户不可见的实现的角色。另一方面,非静态函数扮演接口的角色,并且对函数的客户端可见。
假设您正在编写一个库,您需要定义一个小辅助函数。也许你将此函数命名为 test
:
int test(int x)
{
return x > 100;
}
此函数不是 public 接口的一部分,因此您将其隐藏在 .c 文件中。一切都很好吧?
错了。
问题 #1:任何人都可以简单地通过将此声明添加到他们的代码中来使用此函数:
int test(int);
问题 #2:想象一下,如果另一个库有自己的 test
辅助函数。如果那个库和你的库在同一个程序中使用,链接器会出错,因为两个函数不能同名。
解决方案是使用static
。使用 static
,这些函数对于它们的翻译单元是唯一的,不会在全局公开。
我在这个线程上阅读了 C 中的静态函数:
据我了解,基本上你定义静态函数的地方是唯一可以调用它的 "place"/文件(fileA.c 即),这有点使这个函数 "private" 到那个 .c 或 .h 文件(或翻译单元)。但是如果你#include这个文件在其他一些(fileB.c)你仍然可以在那里使用它?
所以我试图了解在哪种情况下您希望该函数对于它自己的 .c 是静态的,以及如果您仍然可以通过仅包含其中的文件来使用该 "private"/static 函数,它是如何有意义的它被定义了。
此外,据我了解,如果您不包含定义了某些函数的其他文件,您将无法 use/call 那个函数,对吗?
换句话说,我只是无法理解静态函数的典型用例是什么,以及它与非静态函数的基本区别。
C 中的静态函数通常用于分离接口及其实现。它们扮演对接口的客户不可见的实现的角色。另一方面,非静态函数扮演接口的角色,并且对函数的客户端可见。
假设您正在编写一个库,您需要定义一个小辅助函数。也许你将此函数命名为 test
:
int test(int x)
{
return x > 100;
}
此函数不是 public 接口的一部分,因此您将其隐藏在 .c 文件中。一切都很好吧?
错了。
问题 #1:任何人都可以简单地通过将此声明添加到他们的代码中来使用此函数:
int test(int);
问题 #2:想象一下,如果另一个库有自己的 test
辅助函数。如果那个库和你的库在同一个程序中使用,链接器会出错,因为两个函数不能同名。
解决方案是使用static
。使用 static
,这些函数对于它们的翻译单元是唯一的,不会在全局公开。