c - 将函数声明为静态和不将其包含在标头中有什么区别?
问题描述
以下场景有什么区别?
// some_file.c
#include "some_file.h" // doesn't declare some_func
int some_func(int i) {
return i * 5;
}
// ...
和
// some_file.c
#include "some_file.h" // doesn't declare some_func
static int some_func(int i) {
return i * 5;
}
// ...
如果static
对函数所做的一切都是限制它们对其文件的可访问性,那么这两种情况是否都意味着some_func(int i)
只能从中访问,some_file.c
因为在这两种情况下都没有some_func(int i)
放在头文件中?
解决方案
静态函数对于声明它的 .c 文件是“本地的”。因此,您可以在另一个 .c 文件中拥有另一个函数(静态或非),而不会发生名称冲突。
如果 .c 文件中有一个未在任何头文件中声明的非静态函数,则不能从另一个 .c 文件调用此函数,但也不能在另一个 .c 文件中有另一个同名函数,因为这会导致名称冲突。
结论:所有纯本地函数(仅在 .c 函数内部使用的函数,例如本地辅助函数)都应声明为静态,以防止命名空间的污染。
正确用法示例:
文件1.c
static void LocalHelper()
{
}
...
文件2.c
static void LocalHelper()
{
}
...
半正确用法示例
文件1.c
static LocalHelper() // function is local to file1.c
{
}
...
文件2.c
void LocalHelper() // global functio
{
}
...
文件3.c
void Foo()
{
LocalHelper(); // will call LocalHelper from file2.c
}
...
在这种情况下,程序将正确链接,即使LocalHelper
在 file2.c 中应该是静态的
错误使用示例
文件1.c
LocalHelper() // global function
{
}
...
文件2.c
void LocalHelper() // global function
{
}
...
文件3.c
void Foo()
{
LocalHelper(); // which LocalHelper should be called?
}
...
在最后一种情况下,我们有一个 nema collition,程序甚至不会链接。
推荐阅读
- scala - 在使用 udf 进行操作时,将数据框中的空值保持为空
- javascript - 如何在javascript中分组并检测是否存在
- javascript - 根据索引反应setState多个数组
- python - Python函数中的嵌入式SQL(SQLite)提供错误的输出
- python-3.x - 如何在底图投影上绘制散点图?
- python - 无法使用 predict() 函数预测 ARIMA 中给定输入日期的值
- php - 我修改后的 php 邮件功能不起作用
- python - 存储站点特定设置的最佳位置在哪里?
- arrays - 从 php 访问 json_decode 数组值
- javascript - 如何拆分并获取字符串中的值