我试图了解内部链接和外部链接,所以我尝试了这个程序:
// foo.h
static int x = 7; // makes x internally linked
void print();
// foo.cpp
#include "bar.h"
#include <iostream>
void func()
{
std::cout << x << '\n';
}
// bar.h
static int x = 5; // internally linked. without "static" itis linked externally
void func();
// bar.cpp
#include "bar.h"
#include <iostream>
void func()
{
std::cout << x << '\n';
}
// driver program
#include <iostream>
// forward declarations
void func();
void print();
int main()
{
func();
print();
}
为简洁起见,我删除了包含保护(或 #pagma 一次)。我还前向声明
func()
和print()
函数,因为如果我包含定义它们的头文件foo.h
,bar.h
那么编译器将不会编译,因为重新定义了 objectx
。当我运行程序时,我总是从两个函数中得到相同的值
func
,print
尽管它们引用了一个单独的对象x
。
输出:
5
5
通常会print
打印7
,因为包括foo.h
将其x
对象初始化为7
.
- 我已经
x
在两个标题中声明static
要在 TU 中内部链接它,否则如果static
从它们中删除,则两个对象具有外部链接,这会导致链接器由于对象的多个定义而失败x
。