C++ 外部链接

标签 c++ extern incomplete-type

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

源.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 变量。

关于C++ 外部链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46759749/

相关文章:

c++ - 外部 vs 单例类

c - 编译时 undefined reference

c++ - 有没有办法在没有 .* 或 ->* 运算符的情况下调用成员函数

c++ - 为什么 MSVC 10.0 编译器经常忽略 inline 关键字?

c++ - 在 Objective-C 代码中使用 extern "C"的链接器错误

C++ 在 Pimple 习语中的类之前或成员之前进行前向声明?

c++ - 是否需要诊断使用不完整的类型?

c++ - 如何安装clang头文件?

c++ - 在 VC++6 中使用 vector 进行数组排序时出错,而在 VC++2012 中没有错误

c - "parameter has incomplete type"警告