什么是外部联系和内部联系?
我想了解外部联系和内部联系及其差异。
我也想知道的意义
const
变量默认内部链接,除非另外声明为extern
。
当您编写实现文件( .cpp
, .cxx
等)时,编译器会生成一个翻译单元 。 这是来自实施文件的目标文件以及#include
所有标题。
内部联系是指仅在翻译单位范围内的所有内容。
外部联系是指超出特定翻译单位的东西。 换句话说, 可以通过整个程序 (即所有翻译单元(或目标文件)的组合)访问。
正如dudewat所说,外部链接意味着符号(功能或全局变量)可在整个程序中访问,而内部链接意味着它只能在一个翻译单元中访问。
您可以使用extern
和static
关键字明确控制符号的链接。 如果未指定的联动是默认键是extern
用于非const
符号和static
(内部)为const
的符号。
// in namespace or global scope
int i; // extern by default
const int ci; // static by default
extern const int eci; // explicitly extern
static int si; // explicitly static
// the same goes for functions (but there are no const functions)
int foo(); // extern by default
static int bar(); // explicitly static
请注意,不要使用static
内部链接,最好使用匿名命名空间,您也可以将class
放入其中。 匿名命名空间的链接在C ++ 98和C ++ 11之间发生了变化,但主要原因是它们无法从其他翻译单元访问。
namespace {
int i; // external linkage but unreachable from other translation units.
class invisible_to_others { };
}
考虑下面的例子:
1.cpp
void f(int i);
extern const int max = 10;
int n = 0;
int main()
{
int a;
//...
f(a);
//...
f(a);
//...
}
2.cpp
#include <iostream>
using namespace std;
extern const int max;
extern int n;
static float z = 0.0;
void f(int i)
{
static int nCall = 0;
int a;
//...
nCall++;
n++;
//...
a = max * z;
//...
cout << "f() called " << nCall << " times." << endl;
}
注意:静态关键字具有双重作用。 当用于全局变量的定义时,它指定内部链接。 当用于局部变量的定义时,它指定变量的生命周期将是程序的持续时间,而不是该函数的持续时间。
希望有所帮助!
链接地址: http://www.djcxy.com/p/73049.html