关于linker一个奇怪的问题,请高手指点

MarsChen 2006-01-04 10:39:24
-------------------test.h-------------------------
#ifndef _TEST_
#define _TEST_

#include <stdio.h>

class test
{
public:
void sayhello();
};

void test::sayhello()
{
printf("hello\n");
}

#endif

----------------------ta.h----------------------
#ifndef _TA_H_
#define _TA_H_

class ta
{
public:
void say();
};

#endif

---------------------ta.cpp----------------------
#include "StdAfx.h"
#include "ta.h"
#include "test.h"

void ta::say()
{
test obj;
obj.sayhello();
}

---------------------test_linker.cpp--------------------
#include "stdafx.h"
#include "test.h"

int _tmain(int argc, _TCHAR* argv[])
{
test obj;
obj.sayhello();
return 0;
}

编译时报告出错:sayhello重复定义。以上sayhello的函数定义是直接放在test.h中的。
如果加一个test.cpp,并将sayhello的函数定义放到test.cpp中,编译就没有问题。

这是为什么?请高手指点,多谢了
...全文
72 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
Stefine 2006-01-04
  • 打赏
  • 举报
回复
首先确认下, 加上inline确实是可行D

但楼上的后面说的那句话有点问题吧

如果你两个地方包含了.h,那么这个函数就被定义了两遍。
看看编译原理。

楼主这里在头文件中用了条件编译,所以第二次调用时并不会再去定义了啦!

下面是我对inline的一些理解,有错之处,请指出
在头文件中加上inline只是为了编译可以优化,而尽量避免去CPP文件中定义了,不过inline函数一般得为简单的(如不可以包含switch / case这些,还有一些),其实他就像OS中访问内存的数据时设置快表一样的原理,就如CACHE,为多次可能用到的函数直接用高速的东东保存!

madmanahong 2006-01-04
  • 打赏
  • 举报
回复
放到.h中必须声明为inline啊。

如果你两个地方包含了.h,那么这个函数就被定义了两遍。
看看编译原理。

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧