有人能告诉我在课堂外声明静态功能的目的是什么?这2的区别是什么?在这种情况下使用静态有什么好处吗?
static void someRandomFunction();
int main()
{
someRandomFunction();
return 0;
}
和
void someRandomFunction();
int main()
{
someRandomFunction();
return 0;
}
答案 0 :(得分:45)
在命名空间范围内,static
提供了一个名称内部链接,这意味着它只能在包含该定义的翻译单元中访问。没有static
,它有外部链接,并且可以在任何翻译单元中访问。
因此,当您编写仅用于本单元的功能时,您将使用static
(或者,一个未命名的命名空间);内部链接意味着其他单元可以使用相同的名称定义不同的功能,而不会导致命名冲突。
非标准函数(以及一般的全局名称)最好在标题中声明,以确保使用它们的每个翻译单元都获得相同的声明。
答案 1 :(得分:12)
static
函数仅在文件范围内可见。这是一个C功能
在C ++中使用的推荐方法是使用匿名命名空间,如:
namespace // no name, i.e. anonymous
{
static void someRandomFunction();
}
int main()
{
someRandomFunction(); // visible only within this file.
return 0;
}
请注意, body 函数也必须在相同文件中的某处声明,因为链接器不会尝试在其他(外部)转换单元中找到它。<登记/>
所以static void someRandomFunction();
实际上是一个前向声明,用于在同一文件的其他地方定义的函数(即在同一个翻译单元中)。
如果实际调用了该函数,除非在同一文件中定义了函数体,否则会出现链接错误。
答案 2 :(得分:11)
全局函数或变量上的static
关键字将函数或变量的可见性和链接范围限制为当前translation unit。
这意味着对于一个函数,它只能从当前源文件调用,而不能从其他源文件调用。
答案 3 :(得分:3)
静态方法和静态函数完全不同。
静态方法是类的方法,而不是实例(您已经知道,似乎如此)。
另一方面,静态函数是仅在它们所定义的模块中可用的函数。它们不会被导出,也不能放在头文件中并在另一个c文件中使用。通过这种方式,您可以编写共享相同名称的不同函数,并且编译器可以通过内联函数来更彻底地优化代码,因为知道没有其他文件依赖于它。
答案 4 :(得分:2)
static void someRandomFunction();
必须在相同的编译单元(源文件)内以及编译单元外使用,不能使用。 然而,如果你有
void someRandomFunction();
一个定义包含程序,该函数可以被整个程序中的任何编译单元使用
答案 5 :(得分:1)
static
告诉编译器不要将该函数添加到目标文件的符号表中。这实际上意味着链接无法找到该函数,这反过来意味着您只能在当前编译单元中直接使用该函数。但是,如果通过函数指针完成,则可以从另一个编译单元调用静态函数。