C ++链接器错误

时间:2009-01-12 11:30:04

标签: c++ visual-studio linker

我有一个这样的函数,它不在一个类中:

// 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(){}
};
砰!固定的。

问题:为什么?

2 个答案:

答案 0 :(得分:13)

包含防护仅保护该功能不被包含在同一翻译单元中两次。但它不会保护该功能两次被包含在整个程序中。

由于该函数是非内联函数,如果它在整个程序中出现多次,则违反了One Definition Rule。使其内联以解决问题,或将定义放入实现文件中,仅将其声明放在标头中。

// Gets the maximum number of tracks displayable. possible fix:
inline utils::uint32 GetConstMaxSystemRange() {
    return constMaxSystemNumber - constMinSystemNumber + 1;
}

另一方面 - 最好不要将const放在内置的返回值上。他们的临时工具不能用const / volatile来限定。但这也不是必要的:无论如何你无法修改它们。据我所知,它被忽略了。但它永远不会产生影响。

答案 1 :(得分:3)

因为如果它是一个自由浮动函数,在每个include上,它将被编译成.obj文件,当涉及到链接时,会有重复。

对于类成员,有一个不同的策略,允许重复 - 稍后由链接器正确处理。

您可以将其放入未命名的命名空间,或在其之前添加静态,因此它将成为翻译单元的本地。但是,这不是解决问题的正确方法 - 只需在标题中包含声明,并将实现放入文件中,您就可以了。

相关问题