c++ - 静态成员显式定义

标签 c++ gcc linker static-linking static-initialization

考虑这段代码:

#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 类的 static int a。(注释掉导致链接器错误) 没有它,链接器会给出 undefined reference 错误。(因为实际上正在使用 Wilma::i,如果我不使用它,则不会出现链接器错误。)

对于 Fred 类的静态 Wilma wilma_ 应该也是如此,即它也应该被显式定义......因为它也在 B 行的代码中使用。 但事实并非如此,如果 Fred::wilma_ 未明确定义,则不会出现链接器错误。 为什么? 在 gcc 4.5.2 上测试

编辑: 我以某种方式对此产生了另一个疑问...

LINE CLINE B 都试图使用一个类的静态对象,int Wilma::iWilma Fred::wilma_ 分别。 但只有 int Wilma::i 的定义是强制性的?

为什么 Wilma Fred::wilma_; 不是强制性的?

我理解 B 行 是空操作的答案。但对于 C 行 也可以这样说吗??

最佳答案

Wilma 没有非静态字段。 Fred::wilma_=w; 什么都不做。

编辑

如果没有非静态成员 - 则没有拷贝。基本上这个赋值是一个空操作,可能只是被编译器优化掉了,而链接器从来没有看到它。添加非静态成员会使拷贝成为引用静态变量的实际操作,因此编译器无法优化它,链接器会看到它。

关于c++ - 静态成员显式定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6670284/

相关文章:

c++ - strchr 不适用于 char[]

c++ - Ubuntu Qmake 不是可执行文件

c++ - OpenGl旋转三角形有一些不好的效果

gcc - 在 Solaris 上,使用 gcc 编译的库与使用 cc 生成的库的使用方式是否相同?

linux - AS 汇编程序 ARM Raspberry PI 3 与 C 库链接?

c++ - HWLOC 链接错误

c++ - CGAL 库 Vertex_visibility_graph_2.h 的问题

编译所有 C 文件并使用 Makefile 创建可执行文件

c++ - 无法在另一台使用 OS-X Leopard (10.5.8) 的 Mac 上运行在 OS-X Snow Leopard (10.6.7) 上编译的应用程序。返回 libstdc++.6.dylib 错误

c - 为嵌入式应用构建固件补丁