静态内联方法不需要静态成员初始化

时间:2014-03-06 06:38:41

标签: c++ static inline

有课程:

k.h

class k
{
    static int ii;
    static void foo();
};

k.cpp

#include "k.h"

void k::foo()
{
    ii++;
}

在编译期间,我收到以下错误消息:

error LNK2001: unresolved external symbol "private: static int k::ii" (?ii@k@@0HA)

没关系。但是当我向方法添加inline关键字时,错误就消失了:

class k
{
    static int ii;
    inline static void foo();
};

这不是真实世界的例子,但我不知道这段代码到底发生了什么,可能有人向我解释了这个问题?

1 个答案:

答案 0 :(得分:2)

此代码:

#include <iostream>
using namespace std;

struct k
{
    static int ii;
    static void foo();
};

void k::foo() {
    ii=0;
}

int main() {
    // your code goes here
    return 0;
}

给出了一个链接错误,因为函数k :: foo是由编译器输出的,它引用了k :: ii。

此代码:

#include <iostream>
using namespace std;

struct k
{
    static int ii;
    inline static void foo();
};

inline void k::foo() {
    ii=0;
}

int main() {
    // your code goes here
    return 0;
}

没有给出链接错误,因为函数k :: foo是内联声明的,并且不会从任何地方调用,所以编译器实际上从不为它生成任何代码。

如果在main或其他任何地方添加对k :: foo()的调用,则会出现链接错误。