在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++预声明类引发的无法解析外部符号问题的更多相关文章

  1. 【Python五篇慢慢弹(5)】类的继承案例解析,python相关知识延伸

    类的继承案例解析,python相关知识延伸 作者:白宁超 2016年10月10日22:36:57 摘要:继<快速上手学python>一文之后,笔者又将python官方文档认真学习下.官方给 ...

  2. 模板类 error LNK2019: 无法解析的外部符号

    如果将类模板的声明和实现写在两个独立的文件中,在构建时会出现"error LNK2019: 无法解析的外部符号 "的错误. 解决方法有: 第一种方法,就是把类模板中成员函数的声明和 ...

  3. PHP 类与对象 全解析(三)

    目录 PHP 类与对象 全解析( 一) PHP 类与对象 全解析( 二) PHP 类与对象 全解析(三 ) 13.魔术方法 定义:PHP把所有以__(两个下划线)开头的类方法当成魔术方法     __ ...

  4. PHP 类与对象 全解析( 二)

    目录 PHP 类与对象 全解析( 一) PHP 类与对象 全解析( 二) PHP 类与对象 全解析(三 ) 7.Static关键字 声明类成员或方法为static,就可以不实例化类而直接访问.不能通过 ...

  5. PHP 类与对象 全解析( 一)

    目录 PHP 类与对象 全解析( 一) PHP 类与对象 全解析( 二) PHP 类与对象 全解析(三 ) 1.类与对象 对象:实际存在该类事物中每个实物的个体.$a =new User(); 实例化 ...

  6. Java魔法类:Unsafe应用解析

    本文转载自Java魔法类:Unsafe应用解析 前言 Unsafe是位于sun.misc包下的一个类,主要提供一些用于执行低级别.不安全操作的方法,如直接访问系统内存资源.自主管理内存资源等,这些方法 ...

  7. 未知的生成错误 因为没有预加载,所以无法解析程序集 GalaSoft.MvvmLight

    使用wpf开发时,在ViewModel中引用了DevExpress注册的GalaSoft.MvvmLight命名空间,使用其ViewModelBase,在View界面中绑定事件时出现错误: 错误 13 ...

  8. java类(Class)的概念;对象的概念,声明类的属性 和方法,局部变量和成员变量,面向对象编程思维,抽象的概念

    类(Class)的概念 类是对一组具有相同特征和行为的对象的抽象描述. 理解: [1] 类包含了两个要素:特性和行为 => 同一类事物具有相同的特征和行为. [2] 类是一个群体性概念.例如:网 ...

  9. var this.value 可在任意地方 声明 类成员变量。如果可以利用在C++ 那该有多好啊

    var this.value 可在任意地方 声明 类成员变量.如果可以利用在C++ 那该有多好啊

随机推荐

  1. Python编程Day3—基本运算符、数据类型

    一.基本运算符 1.算数运算 print(10/3) print(10//3) print(10%3) print(10**3) 2.比较运算 print(10==10) print(10!=10) ...

  2. 使用 Helm 包管理工具简化 Kubernetes 应用部署

    当在 Kubernetes 中已经部署很多应用时,后续需要对每个应用的 yaml 文件进行维护操作,这个过程会变的很繁琐,我们可以使用 Helm 来简化这些工作.Helm 是 Kubernetes 的 ...

  3. mysql 开发进阶篇系列 48 物理备份与恢复(xtrabackup 的增量备份与恢复,以及备份总结)

    一.增量备份概述 xtrabackup  和innobackupex  二个工具都支持增量备份,这意味着能复制自上次备份以来更改的数据.可以在每个完整备份之间执行许多增量备份,因此,您可以设置一个备份 ...

  4. mysql 开发进阶篇系列 6 锁问题(事务与隔离级别介绍)

    一.概述 在数据库中,数据是属于共享资源,为了保证并发访问的一致性,有效性,产生了锁.接下来重点讨论mysql锁机制的特点,常见的锁问题,以及解决mysql锁问题的一些方法或建议. 相比其他数据库,m ...

  5. win32程序之子窗口编程

    win32程序之子窗口编程 一丶简介.什么是子窗口 在前边我们已经讲解了窗口的本质.以及如何注册窗口类跟创建窗口. 还讲了消息循环. 那么有很多窗口其实Windows已经帮我们创建出来了.我们直接使用 ...

  6. Thrift架构介绍

    Thrift是一个跨语言的服务部署框架,最初由Facebook于2007年开发,2008年进入Apache开源项目.Thrift通过一个中间语言(IDL, 接口定义语言)来定义RPC的接口和数据类型, ...

  7. Perl数组和hash相关函数

    Perl数组和hash相关函数 内置的数组函数有: each, keys, pop, push, shift, splice, unshift, values 内置的hash函数有: delete, ...

  8. gcc:call to '__open_missing_mode' declared with attribute error

    因为使用 open 函数的时候,如果在第二个参数中使用了 O_CREAT,就必须添加第三个参数:创建文件时赋予的初始权限.这个取决于 gcc 的版本,有的版本不会报这个错误. 解决办法: 找到源码中报 ...

  9. Java并发(一)—— 使用多线程

    Java的线程机制是抢占式的,所谓的抢占式指的是每一个线程都会被分配一个指定大小的时间片,一旦这个时间片用完,就会通过上下文切换到另一个线程上去. 并发是主要是为了提高单处理器的性能.创建一个线程会有 ...

  10. 如何定义一个有效的OWIN Startup Class

    命名约定 Katana在程序集内的程序集名称空间下查找一个叫做Startup的类, 通过属性指定 [assembly: OwinStartup(typeof(OwinConsoleApp.Startu ...