0

我试图了解内部链接和外部链接,所以我尝试了这个程序:

// 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.hbar.h那么编译器将不会编译,因为重新定义了 object x

  • 当我运行程序时,我总是从两个函数中得到相同的值funcprint尽管它们引用了一个单独的对象x

输出:

5
5

通常会print打印7,因为包括foo.h将其x对象初始化为7.

  • 我已经x在两个标题中声明static要在 TU 中内部链接它,否则如果static从它们中删除,则两个对象具有外部链接,这会导致链接器由于对象的多个定义而失败x
4

1 回答 1

1

我尝试了您的代码,但使用foo.cppas

#include "foo.h"
#include <iostream>

void print()
{
    std::cout << x << '\n';
}

输出是

5
7

如您所料,所以我认为您在foo.cpp.

于 2021-01-02T21:04:00.933 回答