为什么跨不同源文件的多变量定义是个问题,而跨不同源的多类定义就不是问题?

我目前在uni学习C++(更准确的说是C++03),遇到了静态成员的初始化问题。非常态静态成员应该在类内声明,但在类外定义,而且,它们也应该在源文件中声明,而不是头文件。此外,它们也应该在源文件中声明,而不是头文件。据我了解,这是因为如果你有一个 myClass.h 头部有一个 myClass 在其中,并 A.cppB.cpp 包括它,那么你就可以保护自己免受多重定义的影响。里面 同样的源文件,有了包含保护,但你却不能保护它免受 我的类.h 曾经出现在 A.cpp 而一旦 B.cpp. 如果你在 myClass.h,但在 myClass然后,在预处理之后,你会在全局范围内复制同样的东西的定义。A.cppB.cpp. 链接器将 “看到 “全局范围的 B.cpp 从内部 A.cpp 和vicecersa,所以在给定的上下文中你会有多个定义,这是个问题。

所以我的问题是,如果这是一个问题,那为什么类的定义是 myClass 在全球范围内 A.cppB.cpp 是不是一个?

解决方案:

不,你误解了原因。static 非常态的变量,应该在类内声明,而在类外定义。constexpr 只需要初始化一次,因为它是在运行时发生的。如果同一个变量在运行时被初始化两次,那就真的有问题了…。因此,它们必须在.cpp中被初始化,这样编译器linker就知道哪个库携带了它。

另一方面,类的定义是编译时的定义,所以linker会扔掉所有重复的变量。(这其实是非常不好的,会导致编译时间差,有时还会出现ODR问题。C++20模块就是为了解决这些问题而开发的)。)

给TA打赏
共{{data.count}}人
人已打赏
未分类

翩翩和飞镖的使用没有任何其他母语[关闭]。

2022-9-13 0:33:35

未分类

如何在python中从用户中读取2个值并找到最高的GPA?

2022-9-13 0:33:37

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索