C++面试考点 头文件与实现文件形式

为什么C++标准头文件没有所谓的.h后缀?

在一个源文件中,函数模板的声明与定义分离是可以的,即使把函数模板的实现放在调用

之下也是ok的,与普通函数一致。

cpp 复制代码
//函数模板的声明
template <class T>
T add(T t1, T t2);
void test1(){
    int i1 = 1, i2 = 2;
    cout << add(i1,i2) << endl;
}
//函数模板的实现
template <class T>
T add(T t1, T t2){
    return t1 + t2;
}

如果在不同文件中进行分离

如果像普通函数一样去写出了头文件、实现文件、测试文件,编译报错

cpp 复制代码
//add.h
template <class T>
T add(T t1, T t2);
//add.cc
#include "add.h"
template <class T>
T add(T t1, T t2){
    return t1 + t2;
}
//testAdd.cc
#include "add.h"
void test0(){
    int i1 = 1, i2 = 2;
    cout << add(i1,i2) << endl;
}

单独编译"实现文件",使之生成目标文件,查看目标文件,会发现没有生成任何与add相关的内容。

单独编译测试文件,发现有与add名称相关的函数,但是没有地址,这就表示只有声明。

在"实现文件"中要进行调用,因为有了调用才有推导,才能由函数模板生成需要的函数

cpp 复制代码
template <class T>
T add(T t1, T t2)
{
    return t1 + t2;
}
//在这个文件中如果只是写出了函数模板的实现
//并没有调用的话,就不会实例化出模板函数
void test1(){
    cout << add(1,2) << endl;
}

此时单独编译实现文件,发现生成了对应的函数

但是在"实现文件"中对函数模板进行了调用,这种做法不优雅。

设想:如果在测试文件调用时,推导的过程中,看到的是完整的模板的代码,那么应该可以解决问题

cpp 复制代码
//add.h
template <class T>
T add(T t1, T t2);
#include "add.cc"

在头文件中加上#include "add.cc",即使实现文件中没有调用函数模板,单独编译 testAdd.cc,也可以发现问题已经解决。

因为本质上相当于把函数模板的定义写到了头文件中。

总结:对模板的使用,必须要拿到模板的全部实现,如果只有一部分,那么推导也只能推导

出一部分,无法满足需求。

换句话说,就是模板的使用过程中,其实没有了头文件和实现文件的区别,在头文件中也需要获取模板的完整代码,不能只有一部分。

C++的标准库都是由模板开发的,所以经过标准委员的商讨,将这些头文件取消了后缀名,与C的头文件形成了区分;这些实现文件的后缀名设为了tcc

相关推荐
峥嵘life1 分钟前
Android WiFi连接过程 wpa_supplicant 日志分析
android·开发语言·php
BerryS3N6 分钟前
深度解析:从零构建生产级大模型 RAG(检索增强生成)系统全栈指南
开发语言·python·ai
今儿敲了吗21 分钟前
Python——函数基础
开发语言·笔记·python
CHANG_THE_WORLD27 分钟前
深入理解递归:从函数调用到调用栈的完整执行过程
java·开发语言·算法
kels88991 小时前
单连接动态增减订阅:股票行情API后端降负载实战方案
开发语言·笔记·python·信息可视化·金融
一拳一个呆瓜1 小时前
【STL】iostream 编程:使用提取运算符
c++·stl
a4493153621 小时前
MacBook USB-C不充电故障诊断:从PD握手到主板供电链路
c语言·开发语言·macos·电脑
德福危险1 小时前
从目录枚举到bash破壳漏洞、从流量抓包到组权限提权:靶机练习之symfonos3
开发语言·bash
meng半颗糖1 小时前
3.Java流程控制语句
java·开发语言·intellij-idea
影寂ldy2 小时前
C# WinForm 三种自定义控件 + 完全自定义重绘控件知识点
开发语言·c#