请问template对编译的影响的问题

hollysky 2004-06-09 02:37:13
对于类

//head file C1.h
class C1
{
public:
C1();
~C1();
}

//cpp file C1.cpp
C1::C1()
{
}

C1::~C1()
{
}

何时
C1的类型被编译到Exe或Dll?
是这样
main()
{
C1 c;
}


还是只要cpp文件被包含了就会被编译而根本不需要引用?

对于模板


//head file
template<class T>
class T1
{
public:
T1();
~T1();
}

//cpp file

template<class T>
T1<T>::T1()
{

}

template<class T>
T1<T>::~T1()
{

}
是在何时会被编译进Exe或Dll模块呢?

是这样

typedef T1<int> TInt;

还是不需就会?
...全文
152 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
wingfiring 2004-06-17
  • 打赏
  • 举报
回复
对于楼主的问题,要弄清什么叫编译单元。一般而言,VC中一个编译单元就是指一个cpp文件以及这个CPP文件所有有效include的任何文件,换句话说,就是预处理之后展开的单一源文件。.h文件是不能单独被编译的。如果一个.h的文件从没有任何CPP文件include,那么这个.h文件内的任何内容,都从未进入到某个编译单元,因此从来都不会被处理。但是,如果有多个CPP文件包含它,那么,这个头文件也要被重复处理多次。

至于包含而没有引用的情况,是这样的:普通的定义,只要包含了,就产生目标代码。模版则只有在引用的时候,才会产生目标代码。
Jinhao 2004-06-10
  • 打赏
  • 举报
回复
template 是不会编译到目标文件里的。只有当template被实例化后才会被编译,所以你说的可执行文件中,只存在被实例化的template定义
hollysky 2004-06-10
  • 打赏
  • 举报
回复
Jinhao(辣子鸡丁)(灌水是我无言的抗议)

我提这个问题的目的在于了解“编译时多态”
而且目前我只能针对MS的编译器
因为通常只有在加入.cpp的时候才能对类进行编译。
那么这时候在我们的可执行文件中是否已经存在该类型的某种表达?
qwertasdfg123 2004-06-10
  • 打赏
  • 举报
回复
定义一个类的对象时才会对它进行编译。
Jinhao 2004-06-09
  • 打赏
  • 举报
回复
typedef T1<int> TInt; //不会编译,只有定义一个对象,或被使用才会被编译

看下面的代码

template<typename T>
class A
{
public:
void func(){
A *p;
this=p; //这里!
}
};

int main(){} //这个main不会编译类模板A,所以编译通过

int main() //这个main编译也通过
{
A<int> a;
}

int main() //这个main就通不过
{
A<int> a;
a.func();
}

24,854

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧