在命名空间中声明和定义函数?

时间:2016-03-21 10:02:21

标签: c++

我有以下标题:

M

然而,当我编译时,我得到的错误就像A :: f()的多个定义一样。我认为#ifndef检查足以避免1个翻译单元中的重复定义。也许我错过了什么?

提前致谢。

2 个答案:

答案 0 :(得分:2)

在函数定义之前添加inline说明符:

#ifndef MY_H_
#define MY_H_

namespace A {
inline void f() {
// do something
}
}
#endif

答案 1 :(得分:0)

您应该在头文件中声明函数,但在cpp文件中定义它们。如果您从多个翻译单元(最有可能)中包含此头文件,那么将有多个实现可用于不同的翻译单元。包含此标头的每个cpp文件都将具有f的实现。这样,如果要调用f,则它是不明确的。通过将实现放入cpp文件,可以以这种方式链接和使用它。但是只有一个实现可以使它明确无误。

因此,您的头文件应为:

#ifndef MY_H_
#define MY_H_

namespace A
{
    void f(); // declaration only
}

#endif

和你的源文件:

#include "myHeader.h"

namespace A
{
    void f()
    {
        // some implementation
    }
}

然后,你应该没事。您通常会使用所有功能执行此操作。唯一的例外是inline函数/方法或模板,但这超出了本问题的范围。

相关问题