这已经有一段时间了,但我还没有找到任何真正的解决方案。基本上,我有几个类,大约有10-20个内联函数,每个函数只从类中检索简单信息。所有这些都是一行函数,它们都使用不同的参数做同样的事情。大多数时候它们编译得很好,但是每隔一段时间编译器就会在具有相同类型定义的函数中间说一些未解决的东西。
例如,这是我的类'标题定义的一部分,它具有公共范围:
...
inline uint32_t debug_offset();
inline uint32_t debug_load_addr();
inline uint32_t dol_offset();
inline uint32_t fst_offset();
inline uint32_t fst_size();
inline uint32_t fst_max_size();
...
以下是他们的定义:
...
uint32_t Header::debug_offset()
{
return VectorData::read<uint32_t>(ref(header), Offset::DebugOffset);
}
uint32_t Header::debug_load_addr()
{
return VectorData::read<uint32_t>(ref(header), Offset::DebugAddress);
}
uint32_t Header::dol_offset()
{
return VectorData::read<uint32_t>(ref(header), Offset::DOLOffset);
}
uint32_t Header::fst_offset()
{
return VectorData::read<uint32_t>(ref(header), Offset::FSTOffset);
}
uint32_t Header::fst_size()
{
return VectorData::read<uint32_t>(ref(header), Offset::FSTSize);
}
uint32_t Header::fst_max_size()
{
return VectorData::read<uint32_t>(ref(header), Offset::FSTMaxSize);
}
...
所有这些都可以与其他20个左右的类似函数一起编译,除了fst_offset
抛出此错误:
Error 1 error LNK2001: unresolved external symbol "public: unsigned int __thiscall Header::fst_offset(void)" (?fst_offset@Header@@QAEIXZ)
这也发生在其他几个类中。当所有其他内容都没问题时,我会在所有内联函数中有一两个抛出此错误。简单的解决方法是只使用抛出错误的函数并将正文放在标题中,但这会改变项目的布局并使其不一致。
这是编译错误吗?我做了不同的事情,我不知道吗?我想避免在头文件中定义一些函数,如果可能的话,在源文件中定义其他函数。
答案 0 :(得分:1)
根据我的理解,如果你使用内联,你必须在头文件中定义函数,而不是仅仅声明它。
答案 1 :(得分:1)
我想完全回答这个问题,而不仅仅是根据我发现的内容接受一个非常基本的答案。
我原来的项目希望避免在单个类定义中混合使用函数原型和函数声明。为此,我尝试在cpp文件中定义内联函数,就像普通函数一样,这显然不起作用。
作为妥协,我发现你可以在一个标题中定义一个函数,然后在类定义之外你可以像在cpp文件中一样放置函数声明。当我将内联函数放在cpp文件中时,这可能就是我想到的。
示例:
// example.h
class Example
{
public:
void foo();
void bar(); // Not defined in header, has to be in cpp file and non-inline
}
// Outside Example class definition.
inline void Example::foo()
{
// Code
}