我目前正在清理一些旧代码并找到一个未在任何地方调用的函数FormatString
。所以我决定将它从头文件和源文件中删除。
我首先将其从标题中删除并尝试编译,以确保它不会在项目中的任何其他位置使用。它成功编译,所以我决定在源文件中删除它的定义。
但由于某种原因,我收到链接错误(MVS2015上的LNK2001)。
当我检查链接错误时,unresolved external symbol
消息指向函数GetSomeOtherString
。
我不明白为什么会这样,因为只要我删除标题声明,就没有问题。没有头声明,我假设该函数现在只在其源文件中可用,并且由于文件很小(只有50行),我可以很容易地看到它在任何地方都没有被调用。
我不确定问题所在,所以我尽量复制文件。
header.h
namespace NA {
std::wstring GetSomeString();
std::wstring GetSomeOtherString(const std::wstring &key);
std::wstring FormatString(const std::wstring &key, ...);
void SomeFunction();
}
source.cpp
namespace NA {
inline std::wstring GetSomeString() { return L"SomeString"; };
inline std::wstring GetSomeOtherString(const std::wstring &key) {
//return L"" if key has no value in someMap;
return someMap[key];
}
std::wstring FormatString(const std::wstring &key, ...) {
va_list args;
va_start(args, std::wstring(key));
std::wstring formattedString = L"";
//do formatting
va_end(args);
return formattedString;
}
void SomeFunction() {
//do stuff
}
}
如果重要,以下是使用GetSomeOtherString的代码的样子。 (它在另一个源文件中但在同一个项目中)
namespace {
inline std::wstring SomeOtherFunction (const std::wstring& key) {
//some code
std::wstring x = NA::GetSomeOtherString(key);
//some code
}
}
编辑:
在尝试寻找可以复制此问题的最简单代码之后,我终于找到了答案。我的原帖(以及我愚蠢地忽略了)中缺少的是GetSomeOtherString
在FormatString
内被调用。
std::wstring FormatString(const std::wstring &key, ...) {
va_list args;
va_start(args, std::wstring(key));
std::wstring formattedString = L"";
GetSomeOtherString(key); //<-- HERE
//do formatting
va_end(args);
return formattedString;
}
我发现如果删除源文件中的inline
关键字,即使删除了FormatString
函数定义,也可以成功编译它。 (我也不知道为什么原始程序员会在这里放置inline
个关键字。)
但是,如果我再次放置inline
个关键字,只有在添加使用inline
- ed函数的函数时才会编译。
这里发生了什么?