删除函数定义会导致链接错误,但删除其声明是可以的

时间:2017-04-18 04:09:35

标签: c++ compiler-errors compilation

我目前正在清理一些旧代码并找到一个未在任何地方调用的函数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
    }
}

编辑:

在尝试寻找可以复制此问题的最简单代码之后,我终于找到了答案。我的原帖(以及我愚蠢地忽略了)中缺少的是GetSomeOtherStringFormatString内被调用。

    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函数的函数时才会编译。

这里发生了什么?

0 个答案:

没有答案