类外的静态函数

cuv*_*cuv 40 c++

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

static void someRandomFunction();

int main()
{
    someRandomFunction();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

void someRandomFunction();

int main()
{
    someRandomFunction();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Mik*_*our 48

在命名空间范围内,static给出名称内部链接,这意味着它只能在包含定义的翻译单元中访问.没有static,它具有外部链接,并且可以在任何翻译单元中访问.

因此static,在编写仅用于本单元的函数时,您将使用(或者,一个未命名的命名空间); 内部链接意味着其他单元可以使用相同的名称定义不同的功能,而不会导致命名冲突.

非标准函数(以及一般的全局名称)最好在标题中声明,以确保使用它们的每个翻译单元获得相同的声明.


Som*_*ude 14

static全局函数或变量上的关键字将函数或变量的可见性和链接范围限制为当前转换单元.

这意味着对于一个函数,它只能从当前源文件调用,而不能从其他源文件调用.


Adi*_*vit 13

一个static函数只在文件范围内仍然可见.这是一个C功能.
在C++中执行此操作的推荐方法是使用匿名命名空间,如下所示:

namespace // no name, i.e. anonymous
{
   void someRandomFunction(); 
}

int main()
{
    someRandomFunction(); // visible only within this file.
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

请注意,函数也必须在同一文件中的某个地方声明,因为链接器不会尝试在其他(外部)转换单元中找到它.
因此void someRandomFunction();,实际上是在同一文件中的其他地方定义的函数的前向声明(即在相同的转换单元中).

如果实际调用了该函数,除非在同一文件中定义了函数体,否则将出现链接错误.

  • 不."static"仅在内部链接的情况下将函数保留在文件范围内.使用通常的命名空间规则仍然会在文件中进行名称查找.但是,像往常一样,在这种情况下要小心ODR违规. (2认同)