C++多源文件同名异结构类为何可正常链接?
C++ 多翻译单元同名类相关问题解答
问题1:为何链接器未检测到两个同名但成员不同的类冲突?
这是C++单一定义规则(ODR)范畴的未定义行为,链接器没有强制检测这类违规的义务,不报错不代表代码合法。
当前两份代码仅完成了Entity类的定义,没有实例化类对象,也没有定义该类的非inline成员函数、静态成员变量这类会生成全局链接符号的内容,两个源文件编译后没有任何和Entity相关的全局符号输出,链接器自然无法识别到冲突。
如果后续你在两个翻译单元都实例化Entity对象,或者定义了类的公共非inline成员函数,大概率会触发重复定义报错,或者运行时出现内存布局错乱等不可预期的问题。
问题2:上述两处Entity的编写是否属于类定义?
两处都属于类定义,而非类声明。
C++中仅class Entity;这种没有类体的写法属于类前向声明,只要写出了class 类名 { 类体内容 };的完整结构,无论内部成员如何、是否有初始值,都属于类定义。
问题3:若要在头文件中声明该类,是否可直接采用上述写法?
不可以。
首先类定义放在头文件中供多个源文件引用的前提是:该类定义在所有引入头文件的翻译单元中完全一致,你当前两份Entity的成员组成完全不同,根本无法合并为同一个头文件的定义。
其次如果是已经确定的统一类定义,要放在头文件中时,必须搭配头文件保护(#ifndef/#define/#endif 或者 #pragma once),避免同一个翻译单元重复引入头文件导致类重复定义报错。
问题4:就算类内部为成员变量指定了初始值,该段代码是否仍仅属于类声明?
不是,该代码仍然属于类定义。
成员变量的默认初始值只是类定义的组成部分,不会改变代码的属性:只要包含完整的类体结构,无论是否给成员设置初始值,都属于类定义,而非声明。
内容的提问来源于stack exchange,提问作者yaelreshet11
相关产品推荐
相关产品推荐

