C++外部链接
C++ extern linking
我想尝试外部链接和不完整的类型声明,并编写了此示例:
资料来源.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
的具有外部链接的类,但定义不同。允许编译器和链接器假定它们是同一个类。您的程序没有"正确"的输出。
相关文章:
- 未解决的外部链接问题
- CMake 无法链接外部库
- 外部"C"拆卸导致奇怪的链接器错误
- 在Embarcadero C++ Builder中生成的DLL未解决的外部链接错误
- 链接外部C++外部C++ 在主文件中?
- C++ 为什么在定义的编译和链接之前引用外部实例的程序
- 内联函数/变量的外部链接
- 链接器错误:切换到unicode生成给出:未解析的外部符号WinMain
- C++ 链接器错误 LNK 2019 函数中引用的未解析的外部符号
- C 与 C++ 枚举链接与外部"C"
- 在 CMake 中链接外部 HDFql 库
- CURL 静态链接未解析的外部符号
- 在 Android Studio 中使用 NDK、Gradle 和 CMake 链接外部库
- CMake为什么通过相对路径链接外部库
- 如何使用 CMake 正确链接外部库
- 有没有办法在整个项目中包含和链接外部库,只编辑我的顶级 CMakeList
- Android:在Android Studio中链接外部静态C/C++库
- 链接外部变量 c++ 时出错
- 如何在llvm IR表示中链接外部库
- 在Android Studio (gradle)中链接外部库