设为首页 加入收藏

TOP

C++预声明类引发的无法解析外部符号问题
2017-06-26 10:23:06 】 浏览:9045
Tags:声明 引发 无法 解析 外部 符号 问题

在VisualStudio下开发C++程序常遇到链接问题就是:LNK2019 无法解析外部符号。这个问题一般我们认为是没有将引用的代码链接到当前项目造成,也有例外,就是下面我要说的预声明类导致的。


为了加快编译速度,我们经常选择在头文件中预声明类占个名字用于指针,在代码定义文件中再去包含完整的类声明。


foo.h:


class foo


{


public:


  void call(){};


}


 


bar.h:


class foo;


foo* f=0;


 


bar.cpp:


#include "bar.h"


#include "foo.h"


int main(){f->call();return 0;}


 


当遇到编译单元(一般指cpp文件)出现关联引用(A用B,B用C)时,两次引用其中一个没有包含最终引用对象(C)的声明时也会发生“无法解析外部符号.”


例如:


foo.h:


class foo


{


public:


  void call(){};


}


 


bar.h:


class foo;


void barcall(foo* f=0);


 


bar.cpp:


#include "bar.h"


foo* store;


void barcall(foo* arg)


{


  store = arg;


}


 


main.cpp:


#include "foo.h"


#include "bar.h"


int main()


{


  barcall(0);


  return 0;


}


编译时的main.cpp中的foo类是完整的声明,而bar.cpp中的foo类仅仅是一个空的结构(预定义的),所以编译器会认定他们是不同的结构,导致找不到要找的那个符号。


此例中是因为bar.cpp中没有包含foo.h,所以foo的结构仅仅是个空结构,与main.cpp中对barcall引用的foo结构是不同的,产生找不到符号的链接错误。


解决办法是在bar.cpp中包含foo.h来得到foo的完整声明。


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇使用C++11实现C++17的apply(动态.. 下一篇Java NIO原理分析

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目