【问题标题】:Static inline method no need static member initialization静态内联方法不需要静态成员初始化
【发布时间】:2014-03-06 06:38:40
【问题描述】:

有课:

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();
};

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

【问题讨论】:

  • foo 在哪里使用? ii 在哪里定义? foo 定义在哪里?
  • @Charles Bailey foo 无处使用,ii 无处定义,foo 在 cpp 文件中定义。但是我已经在下面的答案中得到了解释,这似乎完全正确。 foo 未使用,因此不会生成它的代码。

标签: c++ static inline


【解决方案1】:

这段代码:

#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() 的调用,则会出现链接错误。

【讨论】:

  • 在 C++ 中,您为使用的东西付费。
  • 谢谢,听起来合乎逻辑。
猜你喜欢
  • 1970-01-01
  • 2012-07-22
  • 2023-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-06
  • 1970-01-01
  • 2011-07-18
相关资源
最近更新 更多