关于inline

caven 2006-03-30 08:47:09
我在h文件中,声明了函数头;在cpp文件中实现(加上inline).
调用有些inline函数出现link2001(在cpp文件中去掉inline标示或把实现移到h文件中,则正常);但有些没有(不知道为什么);
如果不 去掉inline标示或把实现移到h文件,怎么才能不好错。
...全文
297 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
逸学堂 2006-03-31
  • 打赏
  • 举报
回复
在VC6.0下,inline函数不能外部调用。
比如
class A
{
inline int fun(){
return 3;
}
}

A a;
a.fun(); // 错误,lnk。
caven 2006-03-31
  • 打赏
  • 举报
回复
to postren(小虫) :TTT::add 与 main 在一个文件中当然可以,我的不是在同一个文件中

我决定把cpp inline函数的定义移到h中
firetoucher 2006-03-31
  • 打赏
  • 举报
回复
LZ用VC6?
如果使用的内联函数是在.CPP文件内定义的,而不是在头文件内定义将导致LNK2001错误。

转贴,FYI:

LNK2001:unresolved external symbol
学习VC++时经常会遇到链接错误LNK2001,该错误非常讨厌,因为对于
编程者来说,最好改的错误莫过于编译错误,而一般说来发生连接错误时,
编译都已通过。产生连接错误的原因非常多,尤其LNK2001错误,常常使人不
明其所以然。如果不深入地学习和理解VC++,要想改正连接错误LNK2001非
常困难。
  初学者在学习VC++的过程中,遇到的LNK2001错误的错误消息主要为:
  unresolved external symbol “symbol”(不确定的外部“符号”)。
  如果连接程序不能在所有的库和目标文件内找到所引用的函数、变量或
标签,将产生此错误消息。一般来说,发生错误的原因有两个:一是所引用
的函数、变量不存在、拼写不正确或者使用错误;其次可能使用了不同版本
的连接库。
  以下是可能产生LNK2001错误的原因:
  一.由于编码错误导致的LNK2001。
  1.不相匹配的程序代码或模块定义(.DEF)文件能导致LNK2001。例如,
如果在C++ 源文件内声明了一变量“var1”,却试图在另一文件内以变量
“VAR1”访问该变量,将发生该错误。
  2.如果使用的内联函数是在.CPP文件内定义的,而不是在头文件内定
义将导致LNK2001错误。
  3.调用函数时如果所用的参数类型同函数声明时的类型不符将会产生
LNK2001。
  4.试图从基类的构造函数或析构函数中调用虚拟函数时将会导致LNK2001。
  5.要注意函数和变量的可公用性,只有全局变量、函数是可公用的。
  静态函数和静态变量具有相同的使用范围限制。当试图从文件外部访问
任何没有在该文件内声明的静态变量时将导致编译错误或LNK2001。
  函数内声明的变量(局部变量) 只能在该函数的范围内使用。
  C++ 的全局常量只有静态连接性能。这不同于C,如果试图在C++的
多个文件内使用全局变量也会产生LNK2001错误。一种解决的方法是需要时在
头文件中加入该常量的初始化代码,并在.CPP文件中包含该头文件;另一种
方法是使用时给该变量赋以常数。
  二.由于编译和链接的设置而造成的LNK2001
  1.如果编译时使用的是/NOD(/NODEFAULTLIB)选项,程序所需要的运行
库和MFC库在连接时由编译器写入目标文件模块, 但除非在文件中明确包含
这些库名,否则这些库不会被链接进工程文件。在这种情况下使用/NOD将导
致错误LNK2001。
  2.如果没有为wWinMainCRTStartup设定程序入口,在使用Unicode和MFC
时将得到“unresolved external on _WinMain@16”的LNK2001错误信息。
  3.使用/MD选项编译时,既然所有的运行库都被保留在动态链接库之内,
源文件中对“func”的引用,在目标文件里即对“__imp__func” 的引用。
如果试图使用静态库LIBC.LIB或LIBCMT.LIB进行连接,将在__imp__func上发
生LNK2001;如果不使用/MD选项编译,在使用MSVCxx.LIB连接时也会发生LNK2001。
  4.使用/ML选项编译时,如用LIBCMT.LIB链接会在_errno上发生LNK2001。
  5.当编译调试版的应用程序时,如果采用发行版模态库进行连接也会产
生LNK2001;同样,使用调试版模态库连接发行版应用程序时也会产生相同的
问题。
  6.不同版本的库和编译器的混合使用也能产生问题,因为新版的库里可
能包含早先的版本没有的符号和说明。
  7.在不同的模块使用内联和非内联的编译选项能够导致LNK2001。如果
创建C++库时打开了函数内联(/Ob1或/Ob2),但是在描述该函数的相应头
文件里却关闭了函数内联(没有inline关键字),这时将得到该错误信息。
为避免该问题的发生,应该在相应的头文件中用inline关键字标志内联函数。
  8.不正确的/SUBSYSTEM或/ENTRY设置也能导致LNK2001。
  其实,产生LNK2001的原因还有很多,以上的原因只是一部分而已,对初
学者来说这些就够理解一阵子了。但是,分析错误原因的目的是为了避免错
误的发生。LNK2001错误虽然比较困难,但是只要注意到了上述问题,还是能
够避免和予以解决的。


FT
--
Anything one man can imagine, other men can make real.
postren 2006-03-30
  • 打赏
  • 举报
回复
我在VS2005中测试的,或许是你的系统或编译器出问题了
postren 2006-03-30
  • 打赏
  • 举报
回复
没问题啊
//"Test.h"
class TTT
{
public:
int add(int a, int b);
};
----------
#include "Test.h"
inline int TTT::add(int a,int b)
{
return a+b;
}

void main()
{
TTT tt;
cout << tt.add(1,3);
}

kundy 2006-03-30
  • 打赏
  • 举报
回复
在代码编译的时候只是检查函数是否有有定义,因此当inline函数未被调用的时候是可以通过编译的;但是当链接后,需要使用该inline函数时,需要在调用处展开inline函数,就会报错
ihcbo 2006-03-30
  • 打赏
  • 举报
回复
在声明和定义时是可以同时写inline函数的!
caven 2006-03-30
  • 打赏
  • 举报
回复
to sankt(黄景天) 老兄:

如果 add没有被调用,是可以link过的;
但add被调用,则
p5.obj : error LNK2001: unresolved external symbol "void __cdecl method1(void)" (?method1@@YAXXZ)
Debug/p6.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.
sankt 2006-03-30
  • 打赏
  • 举报
回复
test.h中
inline int add(int a,int b);

test.cpp中
#include "test.h"
int add(int a,int b)
{
return a+b;
}
caven 2006-03-30
  • 打赏
  • 举报
回复
我只是想用inline 函数,但我不想把函数实现放在h 文件中
kundy 2006-03-30
  • 打赏
  • 举报
回复
inline函数的定义常常被置于头文件中,这是由于编译器必须在它被调用的时候加以展开,所以这个时候其定义必须是有效的,同时,这样做使得多个文件可以含入相同的头文件并获得其中定义的inline函数。
dx30611 2006-03-30
  • 打赏
  • 举报
回复
inline在声明后,在定义中是不需要加inline的,就像友元函数在类的外面定义是不用加friend一样
postren 2006-03-30
  • 打赏
  • 举报
回复
代码能不能贴出来啊?

64,650

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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