幻想森林

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
12
返回列表 发新帖
楼主: secondsen

[通用编程] LNK2019。。

[复制链接]

550

主题

9116

帖子

214748万

积分

超级版主

如同神一般的存在,腿神!拖后腿的神~~

Rank: 8Rank: 8

积分
2147483647
 楼主| 发表于 2012-9-16 23:14:41 | 显示全部楼层
工程 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
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
我就是你们的神,庶民们,追随我吧!跟着我一起拖后腿!
回复 支持 反对

使用道具 举报

136

主题

1751

帖子

548

积分

版主

Rank: 7Rank: 7Rank: 7

积分
548
发表于 2012-9-17 09:43:47 | 显示全部楼层
哦,知道了,象
  1. void _2nDs_Vector2D::Set(float fx, float fy)
  2. {
  3.     x = fx;
  4.     y = fy;
  5. }
复制代码
这种只赋值的函数不要用inline,以后你编译时,哪个函数找不到,就把哪个函数的inline标识去掉。
总之,inline省着点用吧,不一定能提高性能的,每个函数都加一个,终于出问题了。
え~え~お!!!
回复 支持 反对

使用道具 举报

550

主题

9116

帖子

214748万

积分

超级版主

如同神一般的存在,腿神!拖后腿的神~~

Rank: 8Rank: 8

积分
2147483647
 楼主| 发表于 2012-9-17 15:45:44 | 显示全部楼层
内联函数还有这个毛病呢???这是什么原理。非常感谢shawind大
我就是你们的神,庶民们,追随我吧!跟着我一起拖后腿!
回复 支持 反对

使用道具 举报

136

主题

1751

帖子

548

积分

版主

Rank: 7Rank: 7Rank: 7

积分
548
发表于 2012-9-17 17:13:25 | 显示全部楼层
也没见过有人特意说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都不提醒,真是的。
え~え~お!!!
回复 支持 反对

使用道具 举报

550

主题

9116

帖子

214748万

积分

超级版主

如同神一般的存在,腿神!拖后腿的神~~

Rank: 8Rank: 8

积分
2147483647
 楼主| 发表于 2012-9-17 20:13:36 | 显示全部楼层
非常感谢非常感谢!!!!!!我自己弄了好久完全没思路
我就是你们的神,庶民们,追随我吧!跟着我一起拖后腿!
回复 支持 反对

使用道具 举报

0

主题

16

帖子

128

积分

③业余

积分
128
QQ
发表于 2012-9-19 12:12:29 | 显示全部楼层
内联函数的链接问题,在我头脑里也不甚清晰,只知道声明和定义要放在一个头文件里,还是"强化"一下:

引用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,编译器也会尽量使用寄存器而非堆栈一样的道理
回复 支持 反对

使用道具 举报

136

主题

1751

帖子

548

积分

版主

Rank: 7Rank: 7Rank: 7

积分
548
发表于 2012-9-19 13:23:26 | 显示全部楼层
这个解说很祥尽,非常受益。
え~え~お!!!
回复 支持 反对

使用道具 举报

550

主题

9116

帖子

214748万

积分

超级版主

如同神一般的存在,腿神!拖后腿的神~~

Rank: 8Rank: 8

积分
2147483647
 楼主| 发表于 2012-9-19 16:56:01 | 显示全部楼层
LSSV587!!!!!!
我就是你们的神,庶民们,追随我吧!跟着我一起拖后腿!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|幻想森林

GMT+8, 2024-4-24 04:04 , Processed in 0.024158 second(s), 19 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表