免费注册 查看新帖 |

Chinaunix

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

★如何避免重定义 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-12-22 13:09 |只看该作者 |倒序浏览
示例代码如下:
main.cpp
#include <iostream>
#include "storageManager.h"
#include "storageManager.cpp"

using namespace std;


int main(int argc, char *argv[])
{
    Adder add(8, 6);
   
    cout<<"(8 + 6) = "<<add.add()<<endl;
   
    cin.get();
      
    return 0;
}



storageManager.h
#ifndef storageManager_h_
#define storageManager_h_
class Adder
{
public:
      
       Adder(int a, int b):_a(a), _b(b){};
      
       int add(void);
      
      
private:
        int _a, _b;            
      
};


#endif


storageManager.cpp
#include "storageManager.h"

int Adder::add(void)
{
    return (_a + _b);
}


用dev c++ 编译出现:
multiple definition of `Adder::add()'

VC编译出现错误:
public: int __thiscall Adder::add(void)" (?add@Adder@@QAEHXZ) already defined in main.obj

我的这段代码不是可以防止重包含和重定义吗?为什么还会出现上述的错误?

#ifndef storageManager_h_
#define storageManager_h_


另外,我在dev-C++里面把工程属性里把文件storageManager.cpp 的“连接时包含”选项去掉 就没问题了。

请高手指教。

论坛徽章:
0
2 [报告]
发表于 2006-12-22 13:23 |只看该作者
建议读一下  loader and linker
另外  .h 就是.h
        .cpp 就是.cpp
不要.cpp中包含.cpp
风格很不好

论坛徽章:
0
3 [报告]
发表于 2006-12-22 13:23 |只看该作者
为什么要inlcude cpp文件,这个是不对的。

论坛徽章:
0
4 [报告]
发表于 2006-12-22 13:50 |只看该作者
那我的那个代码文件(storageManager.cpp)怎么办?

论坛徽章:
0
5 [报告]
发表于 2006-12-22 14:49 |只看该作者
回去看书型!话又说回来了包含.cpp也是可以的

论坛徽章:
0
6 [报告]
发表于 2006-12-22 16:29 |只看该作者
没意义的,混淆了cpp和头文件的作用,容易引起混乱吧。有的时候IDE还是很害人的。虽然降低了门槛,但是会阻碍程序员的成长。

论坛徽章:
0
7 [报告]
发表于 2006-12-22 17:42 |只看该作者
我知道可以将代码文件做成library, .h文件提供接口, 这是好的编程风格。

不过我现在的是为什么我上面的代码不能防止重定义

[ 本帖最后由 JustUSTC 于 2006-12-22 17:43 编辑 ]

论坛徽章:
0
8 [报告]
发表于 2006-12-22 17:46 |只看该作者
原帖由 JustUSTC 于 2006-12-22 17:42 发表
我知道可以将代码文件做成library, .h文件提供接口, 这是好的编程风格。

不过我现在的是为什么我上面的代码不能防止重定义


我觉得那不是编译器该做的,而是程序员的责任。

另外:

       Adder(int a, int b):_a(a), _b(b){};


上面那对红色的花括号,是怎么回事?

原帖由 fireman119 于 2006-12-22 13:23 发表
为什么要inlcude cpp文件,这个是不对的。




确切地说,是不必要。header 和 body 各有用途,虽然都有用。就像头和身体,都派得上用场,但各司其职,不能总让头做身体该做的事情,也不能让身体总是扮演头的角色。

[ 本帖最后由 langue 于 2006-12-22 17:50 编辑 ]

论坛徽章:
0
9 [报告]
发表于 2006-12-22 17:57 |只看该作者
原帖由 langue 于 2006-12-22 17:46 发表


我觉得那不是编译器该做的,而是程序员的责任。

另外:



上面那对红色的花括号,是怎么回事?





确切地说,是不必要。header 和 body 各有用途,虽然都有用。就像头和身体,都派得上用场 ...



(1). 红括号表示构造函数的函数体(为空)。

(2). 请问能否说一下这种情况你是如何组织代码结构的?

论坛徽章:
0
10 [报告]
发表于 2006-12-22 18:07 |只看该作者
/* foo.c */
#include "foo.h"

int global1;

unsigned long int
foo(double arg)
{
    return 0;
}

/* foo.h */

#ifdef _FOO_H_
#else
#define _FOO_H_ 1
extern "C" {
    int global1;
    unsigned long int foo(double);
}
#endif

/* bar.c */
#include "foo.h"

int
main(void)
{
    global1 = global2(5.0);
    return 0;
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP