gpt4 book ai didi

c - 将函数声明为静态和不将其包含在 header 中有什么区别?

转载 作者:行者123 更新时间:2023-12-03 23:34:38 24 4
gpt4 key购买 nike

以下场景有什么区别?

// 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 函数中使用的函数,例如本地辅助函数)都应声明为静态,以防止命名空间的污染。

正确用法示例:

file1.c

static void LocalHelper()
{
}
...

file2.c

static void LocalHelper()
{
}
...

半正确用法示例

file1.c

static LocalHelper()   // function is local to file1.c
{
}
...

file2.c

void LocalHelper()     // global functio
{
}
...

file3.c

void Foo()
{
LocalHelper(); // will call LocalHelper from file2.c
}
...

在这种情况下,程序将正确链接,即使 LocalHelper在 file2.c 中应该是静态的

错误使用示例

file1.c

LocalHelper()          // global function
{
}
...

file2.c

void LocalHelper()     // global function
{
}
...

file3.c

void Foo()
{
LocalHelper(); // which LocalHelper should be called?
}
...

在最后一种情况下,我们有一个 nema 冲突,程序甚至不会链接。

关于c - 将函数声明为静态和不将其包含在 header 中有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61672977/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com