What is external linkage and internal linkage?
我想了解外部联系和内部联系及其区别。
我还想知道
const variables internally link by default unless otherwise declared asextern .
正如Dudewat所说,外部链接意味着符号(函数或全局变量)可以在整个程序中访问,而内部链接意味着只能在一个翻译单元中访问。
您可以使用
1 2 3 4 5 6 7 8 9 | // 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 |
注意,不要使用
1 2 3 4 | namespace { int i; // external linkage but unreachable from other translation units. class invisible_to_others { }; } |
当您编写一个实现文件(
内部链接仅指翻译单元范围内的所有内容。
外部联系是指存在于特定翻译单元之外的事物。换句话说,整个程序都可以访问,它是所有翻译单元(或对象文件)的组合。
- 默认情况下,全局变量具有外部链接。通过在另一个文件中提供匹配的外部声明,它的作用域可以扩展到不包含它的文件。
- 全局变量的作用域可以限制为包含声明的文件,方法是在声明前加上关键字static。这些变量被称为具有内部联系。
请考虑以下示例:
1.CPP1 2 3 4 5 6 7 8 9 10 11 12 | void f(int i); extern const int max = 10; int n = 0; int main() { int a; //... f(a); //... f(a); //... } |
2.CPP
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | #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; } |
注意:关键词static起着双重作用。在全局变量定义中使用时,它指定内部链接。当用于局部变量的定义时,它指定变量的生存期将是程序的持续时间,而不是函数的持续时间。
希望有帮助!
在"C"方面(因为静态关键字在‘C’和‘AMP’和‘C++’之间有不同的含义。
让我们在"c"中讨论不同的范围
范围:基本上就是我能看到东西的时间和距离。
局部变量:作用域仅在函数内部。它位于RAM的堆栈区域。这意味着每次函数被调用所有变量是该函数的一部分,包括函数参数刚创建的,一旦控件退出功能。(因为每次函数返回时都刷新堆栈)
静态变量:范围是一个文件。文件中的每个位置都可以访问在其中声明。它驻留在RAM的数据段中。自从这只能在文件内部访问,因此只能在内部链接中访问。任何其他文件无法看到此变量。实际上,静态关键字是我们可以引入某种级别的数据或函数的唯一方法藏在"C"里
全局变量:此范围适用于整个应用程序。从每一个应用程序的位置。全局变量也驻留在数据段中因为它可以在应用程序中的每个位置访问,因此外联动装置
默认情况下,所有函数都是全局的。以防万一,如果你需要的话从外部隐藏文件中的某些函数,可以为静态函数的关键字。-)
在讨论这个问题之前,最好先了解翻译单元、程序和C++的一些基本概念(实际上,链接是其中的一个)。您还必须知道什么是范围。
我将强调一些要点,特别是那些在以前的答案中遗漏的要点。
链接是名称的属性,由声明引入。不同的名称可以表示相同的实体(通常是对象或函数)。因此,谈论一个实体的链接通常是无稽之谈,除非您确信该实体只能由某些特定声明(通常是一个声明)中的唯一名称引用。
注意,对象是一个实体,但变量不是。在讨论变量的链接时,实际上涉及到所表示实体的名称(由特定声明引入)。名称的链接位于三个链接中的一个:无链接、内部链接或外部链接。
不同的翻译单元可以通过标题/源文件(是的,它是标准的措辞)包含共享相同的声明。因此,您可以在不同的翻译单元中引用相同的名称。如果声明的名称具有外部链接,则该名称引用的实体的标识也将共享。如果声明的名称具有内部链接,则不同翻译单元中的相同名称表示不同的实体,但可以在同一翻译单元的不同范围中引用该实体。如果名称没有链接,则不能从其他作用域引用实体。
(哎呀……我发现我输入的只是重复标准的措辞……)
还有一些语言规范中没有涉及的其他混淆点。
名称空间作用域
我认为C++中的内部和外部链接给出了一个清晰简洁的解释:
A translation unit refers to an implementation (.c/.cpp) file and all
header (.h/.hpp) files it includes. If an object or function inside
such a translation unit has internal linkage, then that specific
symbol is only visible to the linker within that translation unit. If
an object or function has external linkage, the linker can also see it
when processing other translation units. The static keyword, when used
in the global namespace, forces a symbol to have internal linkage. The
extern keyword results in a symbol having external linkage.The compiler defaults the linkage of symbols such that:
Non-const global variables have external linkage by default
Const global variables have internal linkage by default
Functions have external linkage by default
链接确定具有相同名称的标识符是否引用相同的对象、函数或其他实体,即使这些标识符出现在不同的翻译单元中。标识符的链接取决于如何声明。有三种类型的连接:
C++:您还可以在C++和非C++代码片段之间进行链接,称为语言链接。
来源:IBM程序链接
基本上
extern linkage 变量在所有文件中都可见internal linkage 变量在单个文件中可见。
解释:除非另外声明为外部变量,否则常量变量默认内部链接
一个很好的C++链接工具
http://www. GordsBur.Me/C/C++/Link,2016/03/30/19-34-25-Inthalaland and ExelalalLink
在C++中
文件范围内的任何变量,如果不嵌套在类或函数中,则在程序的所有翻译单元中都可见。这被称为外部链接,因为在链接时,链接器在任何地方都可以看到该名称,在该翻译单元之外。
全局变量和普通函数具有外部联系。
文件范围内的静态对象或函数名是翻译单元的本地名称。那就是称为内部链接
链接仅指在链接/加载时具有地址的元素;因此,类声明和局部变量没有链接。