有课程:
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();
};
这不是真实世界的例子,但我不知道这段代码到底发生了什么,可能有人向我解释了这个问题?
答案 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()的调用,则会出现链接错误。