繁体   English   中英

C ++链接器错误

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM