南霁云脸一红,连忙道:“我们抓到两人询问,他们说大王不知去向,山上群龙无首,都乱作一团。”

关于C++编译链接和模板函数


一,关于编译链接
编译指的的把编译单元生成目标文件的过程

链接是把目标文件链接到一起的过程

编译单元:可以认为是一个.c或者.cpp文件。每个编译单元经过预处理会得到一个临时的编译单元。预处理会间接包含其他文件还会展开宏调用。

每个编译单元编译成目标文件后会暴露自己内部的符号。
(比如有个fun函数,就会暴露出于fun函数对应的符号,其他的函数和变量也是一样的。但是也有不会暴露出去的,比如加了static修饰的函数或变量)
每个目标文件都有自己的符号导入表和符号导出表。


链接器根据自己所需要的符号去找其他的目标文件。
(假如main用到了别的文件定义发fun函数,在链接的过程中,链接器知道mian需要fun符号,然后去其他的目标文件总找。如果找到了就链接起来。找不到就报链接错误)

二、模板函数
模板函数的代码并不能直接编译成二进制代码,其中要有一个实例化的过程。模板被用到的时候才会进行实例化。

1.假设有个test.h里面声明了模板函数。
test.cpp实现了那个模板函数。
main用到了那个模板函数。
编译器会编译test.cpp编译单元和main.cpp编译单元。
编译test.cpp时无法给出A<int>::fun这样的符号
main.cpp需要一个这样的符号A<int>::fun。

在分离式编译的环境下,编译器编译某个cpp文件时并不知道另外的cpp的存在,也不会去查找(当遇到未决符号时他会寄希望于链接器)。
这种模式在没有模板的情况下运行良好,但是遇到模板时就不行了,因为模板仅在需要的时候才会实例化出来。
所以当编译器只看到模板的声明时,它不能实例化该模板,只能创建一个具有外部连接的符号,并期待链接器能够将符号的地址决议找出来。
然而实现该模板的cpp文件并没有用到该模板时,编译器就不会去实例化。
所以整个工程当中找不到模板实例的代码,链接器就找不到那个符号。就会报错了。

3.实例:
test.h

#ifndef __CAR_H__
#define __CAR_H__
#include<iostream>
using namespace std;
#define IN_CPP 1
template <class T>
class car
{
public:
    car(T a);
    void print();
public:
    T data;
};
#if IN_CPP
#else
template <class T>
car<T>::car(T a)
{
    data = a;
}
template <class T>
void car<T>::print()
{
    cout << "data = " << data << endl;
}
#endif
#endif // __CAR_H__

test.cpp

#include "car.h"
#if IN_CPP
template <class T>
car<T>::car(T a)
{
    data = a;
}
template <class T>
void car<T>::print()
{
    cout << "data = " << data << endl;
}
#endif
void callTest()
{
    car<int> a(33);
    a.print();
}

main.cpp

#include<iostream>
#include "car.h"
using namespace std;
void fun()
{
    cout << "fun() +++" << endl;
    car<int> a(99);
    a.print();
}
int main()
{
    fun();
    return 0;
}

分析:

IN_CPP 如果是0:就相当于声明实现都在头文件中。这样main.cpp是可以编译运行的。
IN_CPP 如果是1:说明声明跟实现分开了。这种情况main.cpp链接时找不到 car构造相关的函数,也找不到模板类car中print的函数。会报两个链接错。
但是如果在test.cpp写个函数(callTest())调用car的构造和print,相当于实例化了那两个类模板函数。就会导出那两个函数的符号。假如只调用一个构造,那么print就没有实例化。main也会链接失败
然后在main.cpp就可以调用到了。

当前文章:http://hnhdqp.com/forum.php?mod=viewthread&tid=41970

发布时间:2018-10-17 06:35:32

58同城找兼职工作 如何在家兼职赚 网上打字赚钱的网站 可在家做的网络兼职 网上怎么可以赚到钱? 新手如何快速上手网赚 兼职没钱 最新正规兼职赚钱 包赚不赔好指标 小程序有哪些能赚钱

编辑:扁石乙

相关新闻

喜临门全球首个智能床垫健康睡眠系统发布

2018-10-17 07:48:09

琼海先玫仄租售有限公司

中国女足2比0轻取意大利队

2018-10-17 15:22:18

杭州训撕痈网络科技

乐视控股副董事长、网酒网CEO李锐登录纽约时代广场

2018-10-17 13:54:37

六盘水潜淮士科贸有限公司

热门推荐

  • 工信部:2018年6月出台5G国际标准第一版
  • 玩赚餐饮圈:合伙开店最重要的是什么?
  • 一代经典落幕:索尼官宣经典掌机PS Vita停产
  • 春节可乘船夜游海口湾 市民游客可在海口秀英港码头购票登船
  • 调查显示:在役PC平均机龄已达5年,3成电脑超过8年
  • 实时定位/高清拍照,关键多功能儿童电话手表24元(70元券)
  • 索尼Xperia XZ/XZs正式迎来安卓8.0更新
  • 《小小突击队》全新版本 新英雄新皮肤震撼来袭
  • 长宁再添半马!2017上海有哪些路跑赛事?
  • 广东两名未成年嫌犯在看守所到场中考
  • 河北新闻网版权所有 本站点信息未经允许不得复制或镜像 法律顾问:赚客之家注册邀请码 cpa操作赚钱
  • 安卓模拟器刷米赚 copyright ? 2000 - 2016
  • 新闻热线:0311-67563366 广告热线:0311-67562966 新闻投诉:0311-67562994
  • 冀ICP备 09047539号-1 | 互联网新闻信息服务许可证编号:1312006002
  • 广播电视节目制作经营许可证(冀)字第101号|信息网络传播视听节目许可证0311618号
  • 兼职为什么要入会 米赚官方免费下载 答题赚钱外挂 2018最赚钱的游戏排名