C++静态局部函数vs全局函数

Aru*_*run 33 c++ static global

在文件中使用静态函数有什么用处?

它们与文件中的全局函数有何不同?

static int Square(int i)
{
   return i * i;
} 
Run Code Online (Sandbox Code Playgroud)

VS

int Square(int i)
{
   return i * i;
}
Run Code Online (Sandbox Code Playgroud)

das*_*ght 39

在文件中使用静态函数有什么用处?

您可以使用这些函数为同一文件中的其他函数提供共享实现逻辑.特定于文件的各种辅助函数是被声明为文件静态的良好候选者.

它们与文件中的全局函数有何不同?

它们对链接器是不可见的,允许其他编译单元定义具有相同签名的函数.使用命名空间可以在很大程度上缓解此问题,但文件static函数优先于命名空间,因为它们是从C编程语言继承的特性.

  • @Simon Knapp可以使用原型在不同的过渡单元中使用它们. (4认同)

Cha*_*via 15

一个static功能简单的说就是链接器无法导出功能(即使其对其他可见的翻译单元).它使功能"私有"到当前翻译单元.它与在匿名命名空间中包装函数相同.

namespace {

    int Square(int i)
    {
       return i * i;
    } 

}
Run Code Online (Sandbox Code Playgroud)

通常,使用匿名命名空间是实现此目的的首选C++方法,而不是使用static关键字.

  • 为什么这是首选?这对我来说似乎更加冗长. (3认同)
  • 是的,如果你在一个 1000 行文件的中间,检查一个函数是否是静态的比检查它是否在命名空间中更容易,特别是如果你不缩进命名空间的话 (2认同)

SE *_*lio 5

静态函数仅在定义它们的文件中可见。您无法在该特定文件之外引用它们。

在这里阅读更多内容


Yuu*_*shi 5

一句话,联动。static函数具有内部链接,也就是说,它们在翻译单元之外不可见。