[英]C++ Linker Error
我有一个这样的函数,它不在类中:
// Gets the maximum number of tracks displayable
const utils::uint32 GetConstMaxSystemRange()
{
return constMaxSystemNumber - constMinSystemNumber + 1;
}
它在VS2005中编译良好,但是即使在使用Compile Guards的情况下,在第一个包含该文件的文件之后,我仍然收到每个文件的链接器错误。 直觉上,我被这样的课程所包围:
class CDSLimitsAccess
{
public:
// Gets the maximum number of tracks displayable
static const utils::uint32 GetConstMaxSystemRange()
{
return constMaxSystemNumber - constMinSystemNumber + 1;
}
protected:
CDSLimitsAccess(){}
};
砰! 固定。
问题:为什么?
包含保护仅保护该功能两次不被包含在同一翻译单元中。 但是它不会保护该函数不会两次被包含在整个程序中。
由于该函数是非内联函数,因此如果它在整个程序中出现多次,则它违反了一个定义规则。 使它内联以解决问题,或将定义放入实现文件中,仅将其声明放在标头中。
// Gets the maximum number of tracks displayable. possible fix:
inline utils::uint32 GetConstMaxSystemRange() {
return constMaxSystemNumber - constMinSystemNumber + 1;
}
附带说明-最好不要将const放在内置的返回值上。 它们中的临时对象不能使用const / volatile进行限定。 但这也不是必需的:无论如何您都不能修改它们。 据我所知,它被忽略了。 但这永远不会产生影响。
因为如果它是一个自由浮动的函数,那么在每个include上,它将被编译到.obj文件中,而在进行链接时,将存在重复项。
对于类成员,有一个不同的策略,该策略允许重复-稍后由链接器正确处理。
您可以将其放入一个未命名的名称空间中,或在其之前添加一个静态名称,这样它将在翻译单元中变为本地名称。 但是,这不是修复它的正确方法-只需在标头中包含声明,然后将实现放入文件中,就可以了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.