C++ 针对具有内联函数的静态库进行链接时出现问题

C++ 针对具有内联函数的静态库进行链接时出现问题,c++,linker,inline,static-libraries,C++,Linker,Inline,Static Libraries,我有一个静态库,它实现了一个很小的函数,只从一个const字符串表中返回一些字符串。该函数在库中的任何位置都不会被调用,但仍然声明为内联函数。为清楚起见,它看起来如下所示: namespace flow { inline const char* GetName( BYTE methodType ); } 以及实施: const char* flow::GetName( BYTE methodType ) { if ( methodType < 5 ) re

我有一个静态库,它实现了一个很小的函数,只从一个const字符串表中返回一些字符串。该函数在库中的任何位置都不会被调用,但仍然声明为内联函数。为清楚起见,它看起来如下所示:

namespace flow
{
    inline const char* GetName( BYTE methodType );
}
以及实施:

const char* flow::GetName( BYTE methodType )
{
    if ( methodType < 5 )
        return cszNameTable[ methodType ];

    return NULL;
}
现在,我可以通过从静态库中的函数声明中删除内联关键字来轻松解决这个问题。下面是我的问题:

1为什么会出现此错误?在不删除内联关键字的情况下,如何在不修改静态库源代码的情况下修复它

2在库本身未调用的静态库函数中使用inline关键字有什么好处?当从另一个项目链接库时,内联关键字是否有任何影响?我想是的,但我不确定

1为什么会出现此错误?在不删除内联关键字的情况下,如何在不修改静态库源代码的情况下修复它

将函数声明为内联函数没有意义。您必须在标题中定义它们:

namespace flow
{
    inline const char* GetName( BYTE methodType )
    {
        if ( methodType < 5 )
            return cszNameTable[ methodType ];

        return NULL;
    }
}
2在库本身未调用的静态库函数中使用inline关键字有什么好处?当从另一个项目链接库时,内联关键字是否有任何影响?我想是的,但我不确定


内联的效果是,您可以而且必须在头中定义函数,因为内联函数的实现必须在调用该函数的地方可见

这是一个古老的话题,但有些人可能仍在想:

声明.h文件:

const char* flow::GetName( BYTE methodType )
Implementation.cpp文件:

extern inline const char* flow::GetName( BYTE methodType )
{
    if ( methodType < 5 )
        return cszNameTable[ methodType ];

    return NULL;
}

这可能很明显,但是实现也在头中吗?错误中的_cdecl是怎么回事?你在什么地方对外声明了吗?@Staffan:不,不是,我不是代码的作者,我只是有权访问它。虽然库编译得很好,但可能这就是作者没有看到这个错误的原因,我也一样,噢,Boy,那么链接器错误的原因是因为实现不在头文件中?正如我在对我的问题的评论中所说的。实际上,你不必马上定义它。您可以使用一个单独的声明,后跟一个单独的实现。但两者都必须在标题中。@Staffan:是的,您可以将函数声明为内联函数。但这样做毫无意义。为了能够调用内联函数,其定义必须可用。通常这意味着定义必须在标题中。不过,我对我的语句做了一点修改,希望这样可以减少混淆。@Staffan要学究气,任何编译单元(包括头)都需要查看函数的定义。它们不需要在同一个头文件中。MFC时代的一个常见技巧是在类声明中声明方法,然后将函数的内联定义放在一个单独的.inl文件中,该文件有条件地包含在头文件或MFC源文件中,具体取决于处于调试模式。我认为这是当时无法支持内联调试的调试器的一个解决办法。
extern inline const char* flow::GetName( BYTE methodType )
{
    if ( methodType < 5 )
        return cszNameTable[ methodType ];

    return NULL;
}