我有一个这样的函数,不属于一个类:
// 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(){} };
砰!固定.
问题:为什么?
包含保护仅保护该功能不被包含在同一翻译单元中两次.但它不会保护该功能两次被包含在整个程序中.
由于该函数是非内联函数,如果它在整个程序中出现不止一次,则违反了One Definition Rule.使其内联以解决问题,或将定义放入实现文件中,仅将其声明放在标头中.
// Gets the maximum number of tracks displayable. possible fix: inline utils::uint32 GetConstMaxSystemRange() { return constMaxSystemNumber - constMinSystemNumber + 1; }
另外一点 - 最好不要将const放在内置的返回值上.他们的临时工具不能用const/volatile来限定.但这也不是必要的:无论如何你无法修改它们.据我所知,它被忽略了.但它永远不会产生影响.