C++外部链接

C++ extern linking

本文关键字:链接 外部 C++      更新时间:2023-10-16

我想尝试外部链接和不完整的类型声明,并编写了此示例:

资料来源.cpp:

//Source.cpp
class A {
public: 
   int a=10;
};
A* var1 = new A();
void printA(A* arg)
{
    cout << arg->a << endl;
}

来源1.cpp:

//Source1.cpp
class A
{
public:
    int b = 20;
    int c = 30;
};
A* var2 = new A();
void printB(A* a)
{
    std::cout << a->b;
}

主.cpp:

//main.cpp   
class A;
extern A* var1;
extern A* var2;
int main()
{
    void printA(A*);
    void printB(A*);
    printA(var1); //Prints 10
    printA(var2); //Prints 10
    printB(var2); //Prints 10
    return 0;
}

在第一次调用printA()"10"后,正如我预期的那样打印出来。但是为什么在第二次调用printA()printB()之后也打印"10"呢?

欢迎来到违反一个定义规则的精彩世界。您有两个类,都在文件范围内定义,共享一个名称。

由于类在默认情况下具有外部链接,因此同一类有两个定义,它们彼此不一致。这使得你的程序格式不正确,编译器/链接器可以抱怨,或者只是继续做奇怪的事情。

另一方面,强制类内部链接的方法是在未命名的命名空间中声明它:

namespace {
    class A {
    public: 
       int a=10;
    };
}

由于未命名的命名空间对于每个翻译单元都是唯一的,因此实际上将有两个单独的类定义。需要注意的是,您不能再从翻译单元外部向它们声明extern变量。

程序以

不需要诊断的方式违反一个定义规则,因此格式不正确。程序中的两个翻译单元都定义了一个名为 A 的具有外部链接的类,但定义不同。允许编译器和链接器假定它们是同一个类。您的程序没有"正确"的输出。