社区应用 最新帖子 精华区 社区服务 会员列表 统计排行 道具中心
主题 : LNK2019。。
secondsen 离线
级别: 总版主
显示用户信息 
10  发表于: 2012-09-16   
工程 vs2010,帮忙看看,cpp为啥被忽略啊?我新建的工程,就一个类,还是有问题


用命令行显示出来的
复制代码
  1. Microsoft (R) COFF/PE Dumper Version 10.00.30319.01Copyright (C) Microsoft Corporation.  All rights reserved.
  2. Dump of file 2nDs_Vector2D.obj
  3. File Type: COFF OBJECT
  4. COFF SYMBOL TABLE000 00AB766F ABS    notype       Static       | @comp.id001 00000001 ABS    notype       Static       | @feat.00002 00000000 SECT1  notype       Static       | .drectve    Section length   41, #relocs    0, #linenums    0, checksum        0    Relocation CRC 00000000005 00000000 SECT2  notype       Static       | .debug$S    Section length  B98, #relocs    0, #linenums    0, checksum        0    Relocation CRC 00000000008 00000000 SECT3  notype       Static       | .debug$T    Section length   94, #relocs    0, #linenums    0, checksum        0    Relocation CRC 00000000
  5. String Table Size = 0x0 bytes
  6.   Summary
  7.          B98 .debug$S          94 .debug$T          41 .drectve



附件: 2nDs_Engine.rar (388 K) 下载次数:2
我就是你们的神,庶民们,追随我吧!跟着我一起拖后腿!
拖后腿的人发勋章!
shawind 离线
级别: 分版主
显示用户信息 
11  发表于: 2012-09-17   
哦,知道了,象
复制代码
  1. void _2nDs_Vector2D::Set(float fx, float fy)
  2. {
  3.     x = fx;
  4.     y = fy;
  5. }

这种只赋值的函数不要用inline,以后你编译时,哪个函数找不到,就把哪个函数的inline标识去掉。
总之,inline省着点用吧,不一定能提高性能的,每个函数都加一个,终于出问题了。
え~え~お!!!
secondsen 离线
级别: 总版主
显示用户信息 
12  发表于: 2012-09-17   
内联函数还有这个毛病呢???这是什么原理。非常感谢shawind大
我就是你们的神,庶民们,追随我吧!跟着我一起拖后腿!
拖后腿的人发勋章!
shawind 离线
级别: 分版主
显示用户信息 
13  发表于: 2012-09-17   
也没见过有人特意说inline有这个问题。我一般是模仿hge中的用法,像:
复制代码
  1. inline void System_SetState(hgeBoolState   state, bool value)
  2. {
  3.     System_SetStateBool(state, value);
  4. }

所以我也从来就不知道inline居然还有这毛病,这是排查出来的。
不过再看看《c++ primer plus》 中说的,inline是让“编译器使用相应的函数代码替换函数调用。”
也就是说,被inline修饰的函数中,应该包含有另外一个函数。
因此只是写得简短,而并没有调用其他的函数的函数,将其内联是没有任何意义的。
没用就算了,居然还会出错。这真是太奇妙了。vc开了/w4都不提醒,真是的。
え~え~お!!!
secondsen 离线
级别: 总版主
显示用户信息 
14  发表于: 2012-09-17   
非常感谢非常感谢!!!!!!我自己弄了好久完全没思路
我就是你们的神,庶民们,追随我吧!跟着我一起拖后腿!
拖后腿的人发勋章!
weiwuyuan 离线
级别: ②入门
显示用户信息 
15  发表于: 2012-09-19   
内联函数的链接问题,在我头脑里也不甚清晰,只知道声明和定义要放在一个头文件里,还是"强化"一下:

引用c++标准N1905:
inline的函数定义可以放在cpp中,只是其它编译单元无法使用这个函数,仅限在cpp内部使用。 放在头文件中的inline函数,可以在不同的cpp中使用(或展开)

就是说调用内联函数的地方一定要能看到这个内联函数的定义,
你可以测试一下,你不要在main.cpp里调用这个内联函数,你就在2nDs_Vector2D.cpp里去调用,你会发现,他能链接成功,
或者你直接在main.cpp里再加上一句:#include "2nDs_Vector2D.cpp"  这样也能链接成功.
这说明什么? 很明显,只要链接器在他所链接的obj里找不到内联函数的定义,他就会报错!
所以,最好是把内联函数的声明和定义写在头文件里,因为从来都是包含.h文件的,没有人去包含cpp文件.头文件被包含了,那内联函数在其所在的obj里不就可见了吗!

对于class,成员函数写在类体里,在最大优化(release)的情况下,都是当做内联函数用的,所以都不用加inline

另外,你也可以反想一下,如果内联函数的声明和定义可以分开写,那么c++的stl就不会把他的实现部分暴露出来.

引用别人的一段话:
编译器发展到今天,inline关键字已经退居二线,类似于register关键字,绝大部分情况下并没有一定得用的必要,本身inline和register都属于“建议而非强制”、“性能相关而非功能相关”,他们所做的事情本就不应该有程序员干预,而应该是编译器优化做的事情,换句话说inline和register是在编译器不够智能的时代的人为干预优化。
目前的主流编译器,可以做到即便你不写inline,适合内联的函数也会内联,正如你不写register,编译器也会尽量使用寄存器而非堆栈一样的道理
[ 此帖被weiwuyuan在2012-09-19 12:42重新编辑 ]
shawind 离线
级别: 分版主
显示用户信息 
16  发表于: 2012-09-19   
这个解说很祥尽,非常受益。
え~え~お!!!
secondsen 离线
级别: 总版主
显示用户信息 
17  发表于: 2012-09-19   
LSSV587!!!!!!
我就是你们的神,庶民们,追随我吧!跟着我一起拖后腿!
拖后腿的人发勋章!
描述
快速回复

认证码:

验证问题:
22-5=?,答案:17 正确答案:17
按"Ctrl+Enter"直接提交