通过包含访问函数与声明静态

Tah*_*lil 2 c++ oop static include

我有一个头文件,我想包含在另一个cpp文件中.我想知道如果我写这样的头文件有什么区别,

#include <iostream>
#include <string>
using namespace std;

string ret()
{
return "called";
}
Run Code Online (Sandbox Code Playgroud)

===================================

#include <iostream>
#include <string>
using namespace std;

static string ret()
{
return "called";
}
Run Code Online (Sandbox Code Playgroud)

ret()无论如何我都可以访问这个功能!那么,静态的用途是什么?

Rei*_*ica 5

这是一个非常邪恶的头文件,你正在展示.

  1. 永远不要放入using namespace std;头文件.这会强制包括标头在内的任何人拥有std全局命名空间中的所有内容.

  2. 使用某种形式的包含警卫.

  3. static使函数.cpp在包含它的位置之外不可见.这意味着.cpp包含标题的每个都将拥有自己的函数副本.static(非成员)函数只应在您特别需要此行为时使用.

  4. 如果你不使用static,你应该将标题中的定义移动到源文件中(如果你想要定义一次),或者声明函数inline(如果可能的话,它的代码将在每个调用站点上内联).如果不同时执行这些操作,如果将标头包含在多个源文件中,则会出现多个定义错误.

  • 解决方案是*不*定义头中的函数,*或*使其静态/将其置于匿名命名空间中,如果你确实*想要*那种行为.但是为了避免多个定义错误而声明它"内联"是一个丑陋的kludge IMNSHO.你不仅在每个翻译单元中获得函数的代码,而且*在每个被调用的地方获得*,即比使用静态更糟糕... (2认同)