我有以下标题:
M
然而,当我编译时,我得到的错误就像A :: f()的多个定义一样。我认为#ifndef检查足以避免1个翻译单元中的重复定义。也许我错过了什么?
提前致谢。
答案 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
函数/方法或模板,但这超出了本问题的范围。