extern template
时间: 2023-10-06 11:13:38 浏览: 47
extern template 是C++11标准中引入的一个特性,用于减少模板实例化的重复工作。通过使用 extern template,可以在一个编译单元中声明一个外部模板,告诉编译器该模板的实例化将在其他地方进行,从而避免在当前编译单元中实例化该模板。这样可以减少编译时间和可执行文件的大小。
在使用 extern template 时,需要在声明该外部模板之前加上 extern template 关键字,然后指定模板的参数类型。例如:
extern template void fun<int>(int);
这样,编译器就会知道该模板实例化将在其他地方进行,而不会在当前编译单元中实例化。
需要注意的是,extern template 只适用于模板的显式实例化,而不适用于隐式实例化。
相关问题
template with Clinkage
在C++中,当使用模板时,模板函数的名称会被C++编译器进行名称修饰。这导致在C++代码中使用模板函数时,无法直接与C语言进行互操作。为了解决这个问题,可以使用"extern C++"关键字来告诉编译器在使用模板函数时不进行名称修饰。具体步骤如下:
1. 在C++代码中声明模板函数,并使用"extern C++"关键字来告诉编译器不进行名称修饰。例如:
```
extern "C++" {
template <typename T>
void func(T t); //模板函数声明
}
```
2. 在C++代码中调用模板函数,就像调用普通的C++函数一样。例如:
```
int main() {
func<int>(1); //调用模板函数
return 0;
}
```
需要注意的是,当使用"extern C++"声明模板函数时,需要确保模板函数的定义与声明完全一致,否则会导致链接错误。同时,"extern C++"只能用于C++代码与C代码之间的互操作,不能用于C++代码与其他编程语言之间的互操作。
c++ extern修饰模板
当在不同的源文件中使用同一个模板时,需要使用 extern 关键字来声明模板实例,以便在链接时能够正确地找到和使用这些实例。
具体来说,当模板被定义在头文件中时,每个使用该头文件的源文件都会包含该模板的定义,导致在链接时出现重复定义的问题。为了避免这种情况,可以使用 extern 关键字来声明模板实例,并将其定义放在一个单独的源文件中。
例如,假设有一个头文件 template.h 包含如下模板定义:
```c++
template<typename T>
void foo(T t);
```
在实现源文件 template.cpp 中,可以使用 extern 关键字声明该模板实例:
```c++
#include "template.h"
template<typename T>
extern void foo(T t);
template<typename T>
void foo(T t)
{
// 实现代码
}
```
在其他源文件中,只需要包含 template.h 头文件即可调用 foo 函数,编译器会自动在链接时将所有实例链接到一起。