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

发布时间:2026/5/22 22:41:03

C++面试考点 头文件与实现文件形式 为什么C标准头文件没有所谓的.h后缀在一个源文件中函数模板的声明与定义分离是可以的即使把函数模板的实现放在调用之下也是ok的与普通函数一致。//函数模板的声明 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; }如果在不同文件中进行分离如果像普通函数一样去写出了头文件、实现文件、测试文件编译报错//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名称相关的函数但是没有地址这就表示只有声明。在”实现文件“中要进行调用因为有了调用才有推导才能由函数模板生成需要的函数template class T T add(T t1, T t2) { return t1 t2; } //在这个文件中如果只是写出了函数模板的实现 //并没有调用的话就不会实例化出模板函数 void test1(){ cout add(1,2) endl; }此时单独编译实现文件发现生成了对应的函数但是在“实现文件”中对函数模板进行了调用这种做法不优雅。设想如果在测试文件调用时推导的过程中看到的是完整的模板的代码那么应该可以解决问题//add.h template class T T add(T t1, T t2); #include add.cc在头文件中加上#include add.cc即使实现文件中没有调用函数模板单独编译 testAdd.cc也可以发现问题已经解决。因为本质上相当于把函数模板的定义写到了头文件中。总结对模板的使用必须要拿到模板的全部实现如果只有一部分那么推导也只能推导出一部分无法满足需求。换句话说就是模板的使用过程中其实没有了头文件和实现文件的区别在头文件中也需要获取模板的完整代码不能只有一部分。C的标准库都是由模板开发的所以经过标准委员的商讨将这些头文件取消了后缀名与C的头文件形成了区分这些实现文件的后缀名设为了tcc

相关新闻