1.采用的是分离方式编译,也就是说我在一个cpp中编译,只编译了一个,那么如果我在一个cpp中运行的话,是不是编译了多个,并且连接生成了exe?
2.在同一个项目下的cpp是平行关系,那么如果我要用到另外一个cpp的函数或者变量的话,是不是要先编译那个cpp文件?
3.一个项目只有一个main函数,那么在没有main函数的cpp中,定义的函数都是全局函数,变量都是全局变量,对吗?
1.2.即便有多个cpp,也只能有一个main函数,编译器会从main函数开始执行,检测函数或变量依赖行为,在适当的时候编译其他cpp文件;
3.在没有main函数中定义的函数和变量不一定都是全局变量,static全局函数和static全局变量的作用域被限制在该文件内,该文件外不能引用。若要引用全局变量和全局函数,应加extern关键字向编译器表明所引用内容在其他文件中定义,编译器执行时便会对其自动检索。
你没有理解分离式编译模式,_分离编译模式源于C语言,在C++语言中继续沿用。简单地说,分离编译模式是指:一个程序(项目)由若干个源文件共同实现,而每个源文件单独编译生成目标文件,最后将所有目标文件连接起来形成单一的可执行文件的过程。_分离编译模式是C/C++组织源代码和生成可执行文件的方式。在实际开发大型项目的时候,不可能把所有的源程序都放在一个头文件中,而是分别由不同的程序员开发不同的模块,再将这些模块汇总成为最终的可执行程序。这里就涉及到不同的模块(源文件)定义的函数和变量之间的相互调用问题。C/C++语言所采用的方法是:只要给出函数原型(或外部变量声明),就可以在本源文件中使用该函数(或变量)。每个源文件都是独立的编译单元,在当前源文件中使用但未在此定义的变量或者函数,就假设在其他的源文件中定义好了。每个源文件生成独立的目标文件(obj文件),然后通过连接(Linking)将目标文件组成最终的可执行文件。程序编译的简要过程包括预处理(Preprocessing)、编译(Compilation)、汇编(Assembly)和连接(Linking)。
其实按你所述,只是要实现不同源文件间的函数调用,首先实现头文件与各个函数源文件的分离,一个源文件中定义的函数,往往会被其他源文件使用,这时就需要在其他源文件中声明要使用的函数。在有多个源程序文件的项目程序里,往往是把函数的声明放在头文件里,当其他的源文件要声明并使用某个函数时,只要采用#include指令包含头文件既可。我们使用各种库函数的方式就是如此,使用库中函数,首先要声明,即包含相应的头文件。调用时,编译器会根据函数的声明,到库中查找函数的定义。**_函数不能只有声明,还必须有定义。_**函数的定义一般在各个源文件中实现。
不是这样的,编译的时候都要编译的,没有先后关系,编译器会自动检测依赖关系,多个文件编译尽量不要使用全局变量,减少耦合,要是使用的话要加extern关键字
cpp都是各自编译成obj目标文件,然后再所有的obj链接成一个完整的exe。
cpp的函数,变量等都是在各自的编译单元。他们的可见性有external,internal