secondsen 发表于 2012-9-16 23:14:41

工程 vs2010,帮忙看看,cpp为啥被忽略啊?我新建的工程,就一个类,还是有问题


用命令行显示出来的
Microsoft (R) COFF/PE Dumper Version 10.00.30319.01Copyright (C) Microsoft Corporation.  All rights reserved.

Dump of file 2nDs_Vector2D.obj
File Type: COFF OBJECT
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
String Table Size = 0x0 bytes
  Summary
         B98 .debug$S          94 .debug$T          41 .drectve

shawind 发表于 2012-9-17 09:43:47

哦,知道了,象

void _2nDs_Vector2D::Set(float fx, float fy)
{
    x = fx;
    y = fy;
}

这种只赋值的函数不要用inline,以后你编译时,哪个函数找不到,就把哪个函数的inline标识去掉。
总之,inline省着点用吧,不一定能提高性能的,每个函数都加一个,终于出问题了。

secondsen 发表于 2012-9-17 15:45:44

内联函数还有这个毛病呢???这是什么原理。非常感谢shawind大

shawind 发表于 2012-9-17 17:13:25

也没见过有人特意说inline有这个问题。我一般是模仿hge中的用法,像:

inline void System_SetState(hgeBoolState   state, bool value)
{
    System_SetStateBool(state, value);
}

所以我也从来就不知道inline居然还有这毛病,这是排查出来的。
不过再看看《c++ primer plus》 中说的,inline是让“编译器使用相应的函数代码替换函数调用。”
也就是说,被inline修饰的函数中,应该包含有另外一个函数。
因此只是写得简短,而并没有调用其他的函数的函数,将其内联是没有任何意义的。
没用就算了,居然还会出错。这真是太奇妙了。vc开了/w4都不提醒,真是的。

secondsen 发表于 2012-9-17 20:13:36

非常感谢非常感谢!!!!!!我自己弄了好久完全没思路

weiwuyuan 发表于 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,编译器也会尽量使用寄存器而非堆栈一样的道理

shawind 发表于 2012-9-19 13:23:26

这个解说很祥尽,非常受益。

secondsen 发表于 2012-9-19 16:56:01

LSSV587!!!!!!
页: 1 [2]
查看完整版本: LNK2019。。