社区
C++ 语言
帖子详情
关于inline
caven
2006-03-30 08:47:09
我在h文件中,声明了函数头;在cpp文件中实现(加上inline).
调用有些inline函数出现link2001(在cpp文件中去掉inline标示或把实现移到h文件中,则正常);但有些没有(不知道为什么);
如果不 去掉inline标示或把实现移到h文件,怎么才能不好错。
...全文
352
13
打赏
收藏
关于inline
我在h文件中,声明了函数头;在cpp文件中实现(加上inline). 调用有些inline函数出现link2001(在cpp文件中去掉inline标示或把实现移到h文件中,则正常);但有些没有(不知道为什么); 如果不 去掉inline标示或把实现移到h文件,怎么才能不好错。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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
打赏
举报
回复
代码能不能贴出来啊?
C语言:
inline
,static
inline
本文详细探讨了C语言中
inline
、static
inline
和extern
inline
的区别,通过实例分析了这些内联函数在编译过程中的行为,解释了如何正确使用内联函数以优化程序性能。
详解static
inline
关键字
本文通过实验对比了__STATIC_
INLINE
与其他几种函数定义方式在C语言中的实际效果,详细分析了其在减少函数调用开销方面的优势及增加代码体积的劣势。
inline
, block,
inline
-blockd的区别
本文详细解析了CSS中display属性的常用值
inline
、block及
inline
-block的特点,并对比了
inline
-block布局与浮动布局的不同之处,同时介绍了如何解决
inline
-block布局中存在的间隙问题。
inline
,static
inline
本文深入解析内联函数的概念,探讨其与宏调用的区别,以及如何在C/C++中使用
inline
关键字来提高函数调用效率。同时,文章还讨论了内联函数的潜在问题,如代码膨胀,并介绍了static
inline
和extern
inline
的使用场景。
嵌入式开发中的
inline
与
inline
_function区别
本文聚焦嵌入式软件开发,介绍了
inline
关键字和类似名称扩展的区别。
inline
是C/C++标准关键字,建议编译器内联展开;类似扩展多为项目或编译器特定,可强制内联。还阐述了相关宏定义的作用、组合使用场景及注意事项,强调要在代码体积、速度和兼容性间权衡。
C++ 语言
65,211
社区成员
250,516
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章