社区
C++ 语言
帖子详情
关于inline
caven
2006-03-30 08:47:09
我在h文件中,声明了函数头;在cpp文件中实现(加上inline).
调用有些inline函数出现link2001(在cpp文件中去掉inline标示或把实现移到h文件中,则正常);但有些没有(不知道为什么);
如果不 去掉inline标示或把实现移到h文件,怎么才能不好错。
...全文
297
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
打赏
举报
回复
代码能不能贴出来啊?
兼容性的
inline
-block 属性
一年前网上还找不到关于
inline
-block 属性的文章,为了方便大家更好的理解该属性,当时总结整理了篇《display:
inline
-block的深入理解》。 而现在对于
inline
-block 属性运用的需求也越来越多,可惜依旧只有 Firefox3 beta、IE8 beta、Opera、Safari 支持
inline
-block 属性(注:原来只有 Opera、Safari 支持),但 IE6、IE7 可以通过触发 hasLayout 来模拟,Firefox2 有-moz-
inline
-box 和 -moz-
inline
-stack 私有属性(这两个属性的比较引用自秦歌的《di
Firefox Bug:
inline
/
inline
-block的间隙采用代码缩进可解决
首先要说明的是,这个标题有点标题党的意思,这个 bug 也存在于 IE8 下,在 IE6 和 IE7 下正常。之前写过两篇关于 IE bug 的文章,这里特意用了 Firefox bug 作为标题,是为了给自己找点心里安慰,省得总是埋怨 IE :)。 关于
inline
-block,可以参考之前的一篇文章 跨浏览器的
inline
-block 这个 bug 是“痛在远方”同学碰到的,确实很诡异啊,貌似对标准支持越好的浏览器才会有这个问题。本文来自前端观察,转载请以链接形式注明出处。 如下图: 在 Firefox 下,
inline
/
inline
-block 的元素直接会有莫名的几像素(貌似是6p
MUI-H5 PULS混合开发视频教程
MUI是国内最主流的跨平台APP开发框架 RN是国外最主流的跨平台APP开发框架,MUI是基于webview进行渲染的,RN是基于原生组件进行渲染,从功能和体验上RN更加接近原生,但是学习难度相对比MUI来说稍微高一些
关于css display:
inline
block
inline
-block的区别分析
display:
inline
-block 将对象呈递为内联对象,但是对象的内容作为块对象呈递。旁边的内联对象会被呈递在同一行内,允许空格。 但对于这个属性不是所有浏览器都识别。 支持的浏览器有:Opera、Safari。 但很遗憾,最流行的 IE 和 Firefox 却不支持这个属性(在 Firefox3 版本中将会支持 display:
inline
-block)。不过 Firefox 下却有私有属性 -moz-
inline
-box 和
inline
-block 形似,为什么是“形似”而不是“神似”呢?这是因为使用 -moz-
inline
-box 会带来很多意想不到的后遗症,比如使用这一属性后,
[转]关于display:
inline
,block,
inline
-block 的详细应用
NULL 博文链接:https://hc24.iteye.com/blog/832493
C++ 语言
64,650
社区成员
250,478
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章