分离式编译

<c++ primer> p186:

  举个例子fact函数的定义位于一个名为fact.cc的文件中,它的声明名为Chapter6.h的头文件中.显然与其他用到fact函数的文件一样,fact.cc应该包含Chapter6.h头文件.另外,我们在名为factmain.cc的文件中创建main函数,main函数将用到fact函数.要生成可执行文件,必须要告诉程序我们用到的代码在哪.如果我们修改了其中一个源文件,那么只需要重新编译那个改动了的文件.大多数编译器提供了分离式编译每个文件的机制,这一过程通常产生一个后缀名是.obj(windows)或者.o(unix)的文件,后缀名的含义是该文件包含对象代码.接下来编译器负责把对象文件链接在一起形成可执行文件.

百度知道:

c++程序使用一对同名的.c和.h文件的意义何在?

h文件中写函数声明,c文件中实现,这样分离之后,如果其他c文件需要调用其中的函数只要包含同名的h头文件即可。吧具体相同功能的函数放置在一个h头文件中声明也有助于分类。项目越大,你如果吧所有函数都写在一个文件中,维护起来就更麻烦了,编译的时候也是一个c文件一个c文件生成中间代码,然后一起链接起来,这样也便于维护。另外还要考虑库的问题,比如你要使用动态库,你如果在h文件中实现函数,那库的意义就不存在了。

时间: 2024-08-06 16:05:18

分离式编译的相关文章

C++ 之 类模板的分离式编译

模版编译篇 目录:1.对于C++中类模板的分离式编译的认识 2.具体的实例 1.对于C++中类模板的分离式编译的认识 为什么C++编译器不能支持对模板的分离式编译(博文链接) 主要内容:编译器编译的一般工作原理.对模版的分离式编译的特殊性(模版的特殊性) 链接: http://blog.csdn.net/pongba/article/details/19130 模版编译的特殊性 对程序进行编译时,对于函数调用,编译器只要求函数的原型在调用点是可见的,至于函数的定义是否存在不做检查(在对程序进行链

c++ 函数声明 &amp; 分离式编译 &amp; 参数传递

p186~p188: 函数声明1.函数只能定义一次,但是可以声明多次. 2.函数的接口:返回类型 + 函数名 + 形参类型 3.为什么要在头文件中进行函数声明???在源文件中定义?暂时理解到,这么做可以增强可读性. 4.含有函数声明的头文件应该被包含到定义函数的源文件中.(例如:#include "diy.h") 分离式编译 & 6.8 & 6.9 1.分离式编译:把源文件割成好几块放在不同的文件夹下.最终要生成可执行文件,就必须告诉编译器源文件在哪里.具体操作如下:

分离式编译时 链接器工具错误 (一个变量被定义一次或多次)

在编写程序时,将类中的函数成员的声明和定义分开,在头文件(.h)中进行声明,在源文件(.cpp)中进行定义 以及具体功能的实现.达到分离式编译的效果,提高代码的可读性. 自己在编写是程序时,程序显示没有错误,但是在生成时,产生了链接器工具错误LNK2005 的错误提示.这个错误 也会导致另外一个错误LNK1169 找到一个或多个多重定义的符号. 原因是在.cpp 文件内定义函数时加上了 inline  修饰符将函数声明成了内联函数. 内联函数用于优化规模较小,流程直接,频繁调用的函数.通常是将内

分离编译

分离式编译是指一个完整的程序或项目由若干个源文件共同实现,每个源文件单独编译生成目标文件,最后将该项目中的所有目标文件连接成一个单一的可执行文件的过程. 每个.cpp源文件经过预处理,它所包含的.h文件的代码都会被展开到其中.再经过编译器的编译汇编等过程,将该.cpp文件转变为.obj文件,这是此文件已经变为二进制文件,本身包含的就是二进制代码.这时,该文件还不一定能够执行,因为并不保证其中一定有main函数,或者该源文件中的函数可能引用了另一个源文件中定义的某个变量或者函数调用,又或者在程序中

(转)c++模板函数声明定义分离编译错误详解

当我们声明和定义一个模板的时候,必须要让声明和定义放在一个文件里.否则编译器会报错. 这就是为什么boost的实现文件的后缀名是hpp了. 这其中的理由是什么呢?为什么会这样? 首先,一个编译单元(translation unit)是指一个.cpp文件以及它所#include的所有.h文件,.h文件里的代码将会被扩展到包含它的.cpp文件里,然后编译器编译该.cpp文件为一个.obj文件(假定我们的平台是win32),后者拥有PE(Portable Executable,即windows可执行文

c++ 模板 不能 分离编译

C++Template头文件和定义分开编译的问题 (1) // Foo.htemplate<typename T>class Foo{public:void f();}; // Foo.cpp#include <iostream>#include "Foo.h" template<typename T>void Foo<T>::f(){std::cout << "Foo<T>::f()/n";}

模板函数(template function)出现编译链接错误(link error)之解析

总的结论:    将template function 或者 template class的完整定义直接放在.h文件中,然后加到要使用这些template function的.cpp文件中. 1. 现象描述 类似于参考文献[1],当我们以如下方式使用模板函数时,会出现模板函数声明.定义分离带来的链接错误: 1 // File "foo.h" 2 template<typename T> 3 extern void foo(); 1 // File "foo.cpp

第二章 变量

2.2.2 变量声明和定义的关系 为了支持分离式编译,C++将变量的声明和定义区分开. 声明: 类型 + 名称               [注意到默认初始化的情况,可能会混淆,所以统一加上extern] 定义: 类型 + 名称 + 存储空间(可能赋初值) 可以多次声明,但只能一次定义. 使用前一定要声明,因为C++是一种静态类型语言,编译时要进行类型检查. 1 extern int i; //声明而非定义 2 int j; // 声明并定义(pay attention!) 3 extern i

【C++注意事项】2 变量声明和定义

不可能将所有的C++程序放到一个文件中咯,因此C++就支持了分离式编译(separate compilation)机制,它允许将程序分为若干个文件,每个文件可被独立编译.这样说明了,当你的程序有很多文件时,修改其中一个文件后不需要将所有文件都重新编译一遍,只需要编译修改过的就好,然后将它们都链接起来. C++是如何支持分离式编译的呢?通过将声明和定义分离开来. 声明(declaration)使得名字为程序所知,一个文件如果想使用别处定义的名字则必须包含该名字的声明. 定义(definition)