【发布时间】:2011-07-12 19:58:09
【问题描述】:
考虑这段代码:
#include<iostream>
using namespace std;
class Wilma
{
public:
static int i;
Wilma()
{
cout<<"\nWilma ctor\n";
cout<<"\ni::"<<i<<"\n";
}
};
class Fred
{
public:
Fred()
{
cout<<"\nFred ctor\n";
}
static Wilma wilma_;
};
int Wilma::i=44;//------------- LINE A
int main()
{
int a=0;
Wilma::i=a;//---------- LINE C
Wilma w;
Fred::wilma_=w;//---------- LINE B
}
这里的 A 行明确定义了 Wilma 类的静态 int a。(注释掉会导致链接器错误) 没有它,链接器会给出未定义的引用错误。(因为实际上正在使用 Wilma::i,如果我不使用它,则不会出现链接器错误。)
Fred 类的静态 Wilma wilma_ 也应如此,即它也应显式定义..因为它也在 B 行的代码中使用。 但事实并非如此,如果 Fred::wilma_ 没有明确定义,则不会出现链接器错误。 为什么? 在 gcc 4.5.2 上测试
编辑: 不知何故,我对此又有了疑问……
LINE C 和 LINE B 都在尝试分别使用int Wilma::i 和Wilma Fred::wilma_ 类的静态对象。
但是只有int Wilma::i 的定义是强制性的吗?
为什么Wilma Fred::wilma_; 不是强制性的?
我理解 B 行 是无操作的答案。但是C行也可以这样说??
【问题讨论】:
标签: c++ gcc linker static-linking static-initialization