类外的静态函数

时间:2014-09-08 12:54:28

标签: c++

有人能告诉我在课堂外声明静态功能的目的是什么?这2的区别是什么?在这种情况下使用静态有什么好处吗?

static void someRandomFunction();

int main()
{
    someRandomFunction();
    return 0;
}

void someRandomFunction();

int main()
{
    someRandomFunction();
    return 0;
}

6 个答案:

答案 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告诉编译器不要将该函数添加到目标文件的符号表中。这实际上意味着链接无法找到该函数,这反过来意味着您只能在当前编译单元中直接使用该函数。但是,如果通过函数指针完成,则可以从另一个编译单元调用静态函数。