免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 9541 | 回复: 7
打印 上一主题 下一主题

[函数] 问一个static成员函数link时候"multiple definition"的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-06-13 15:29 |只看该作者 |倒序浏览
不明白为什么编译的时候会说重复定义.
help~~~

文件如下:

//主文件:static_main.cpp,调用static.h中的A类
#include "static.h"

int main()
{
        A::Init();
        //cout<<A::IsInit()<<endl;
        return 0;
}

//static.cpp文件
#include "static.h"


//static.h文件
#ifndef __STATIC_H
#define __STATIC_H
#include <iostream>
using namespace std;

class A
{
public:
        static int id;//定义
        static void Init()//定义
        {
                bInit=true;
        }
private:
        static bool bInit;
};

int A::id=9;//初始化
bool A::bInit=false;//初始化

#endif

Make方法
g++ -c static.cpp  && g++ -c static_main.cpp && g++ static.o static_main.o -o a.out

错误提示
static_main.o(.data+0x0): multiple definition of `A::id'
static.o(.data+0x0): first defined here
static_main.o(.data+0x4): multiple definition of `A::bInit'
static.o(.data+0x4): first defined here
collect2: ld returned 1 exit status

[ 本帖最后由 山外山 于 2007-6-13 15:32 编辑 ]

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
2 [报告]
发表于 2007-06-13 15:51 |只看该作者
把对类静态成员的初始化放在.cpp文件中。

论坛徽章:
0
3 [报告]
发表于 2007-06-13 15:57 |只看该作者
原帖由 lenovo 于 2007-6-13 15:51 发表
把对类静态成员的初始化放在.cpp文件中。


我知道.
另外还有一种解决方法是把main函数放到static.cpp文件中也可以.不要static_main.cpp文件.

我是希望知道:  我已经#ifndef..#define...#endif了,为什么还有静态成员初始化重复的问题呢?应该是不会重复包含了啊

论坛徽章:
0
4 [报告]
发表于 2007-06-13 16:08 |只看该作者
預處理是對文件而言的,main.cpp和static.cpp又不是一個文件,當然會各自有效包含static.h.

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
5 [报告]
发表于 2007-06-13 16:12 |只看该作者
原帖由 山外山 于 2007-6-13 15:57 发表


我知道.
另外还有一种解决方法是把main函数放到static.cpp文件中也可以.不要static_main.cpp文件.

我是希望知道:  我已经#ifndef..#define...#endif了,为什么还有静态成员初始化重复的问题呢?应该是不会重 ...

如果你把静态成员看成是全局变量,
那你认为把全局变量放在头文件
会出现你这种问题吗?

论坛徽章:
0
6 [报告]
发表于 2007-06-13 17:24 |只看该作者

论坛徽章:
0
7 [报告]
发表于 2007-06-21 19:42 |只看该作者
静态成员应该在cpp文件中初始化.

论坛徽章:
0
8 [报告]
发表于 2007-06-21 20:04 |只看该作者
类 A 中出现的 static int id; 不是定义,是声明。静态成员的定义一般放在类外。类外的 int A::id=9; 是定义并初始化。bInit 成员也是同样的情况。

需要注意的是 Init 函数成员。由于它定义在类内,所以成为一个 inline 函数,它的使用符合“一个定义规则”(ODR)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP