在C++头文件和源文件的详细介绍

在C++头文件和源文件的详细介绍
文件和C++源文件

一、C++编译模式
通常,在一个C++程序,只有两类文件都包括在内——的.cpp文件和.h文件。其中的.cpp文件称为C++源文件,里面包含了C++的源代码,而.h文件称为C++头文件,和它也包含C++源代码。
C+ + language support is compiled separately (separate compilation).That is to say, all the contents of a program can be divided into different parts in different.Cpp files.Everything in the.Cpp file is relatively independent. 当编译(编译),它不需要与其他文件操作。它只需要编译一个目标文件和其他目标文件做一个链接(链接)。例如,在一个文件中定义的全局函数.cpp(){ },以及需要调用在b.cpp文件这一功能。即使如此,文件.cpp文件b.cpp不需要知道对方的存在,但可以分别编译,编译成目标文件,然后链接,使整个程序可以运行
这是怎么实现的呢从写程序的角度来看,这是很简单的。在b.cpp文件,调用无效(一)前空函数的第一个语句的功能(一),就可以了。这是因为b.cpp编译时,编译器会生成一个符号表(符号表),如虚空(),它看不到定义的符号,并将其存储在这个表。当你重新链接,编译器将在其他目标文件找到符号的定义。一旦发现,该程序可以顺利生产。
请注意,有两个概念这里所说的,一个是定义,另一个是声明。一句话,一个定义是一个符号一个完整的描述:它是否是一个变量或函数,它返回什么类型、什么参数需要,等等。声明只是声明的象征,这是存在的,它告诉编译器,在其他文件中定义的符号。我会用这里的第一,然后你可以去别处找出来是什么在定义的时候,一个符号(变量或函数)完全是在C++的语法定义,它只要求写符号的原型,当它宣布。需要注意的是,一个符号可以被声明在程序中多次重要,但只能定义一次。想象一下,如果一个符号有两个不同的定义,他们应该编译听吗
这种机制带来了很多好处的C++程序员,也导致了一个方式来写程序。考虑一下,如果有一个很常用的函数void(F){ },很多。在所有的整个程序cpp文件将被调用,所以我们只需要在一个文件中定义这个功能,和其他文件声明的功能。功能是很好的处理,并声明是一个词,但如果功能较多,如大量的数学函数,有数百人。那又怎么样每个程序员都能确保功能的所有形式都能准确地记录和书写吗
两。什么是头文件
很明显答案是不可能的,但是有一个非常简单的方法,可以帮助程序员记住这么多的麻烦:函数原型我们可以把语句的数百个函数全部准备好,放进一个文件中,程序员需要等到他们把这些东西放进他完整的拷贝源代码之后。
这种方法是可行的,但它太麻烦而笨拙。因此,头文件可以发挥它的作用。事实上所谓的头文件,是内容的内容相同。cpp文件,所有的C++源代码。但头文件没有要编译。我们把所有的函数声明头文件中。当.cpp源文件需要他们,他们可以包含在.cpp文件通过宏命令#包括,使它们的内容可以被合并到.cpp文件。当.cpp文件编译,收录的作用。h文件播放。
例如,假设所有的数学函数只有两种:F1和F2,然后我们把他们的定义math.cpp:

math.cpp / * * /
双f1()
{
在这里做某事…
返回;
}
双F2(双A)
{
在这里做某事…
返回一个;
}
最后math.cpp / * * /
并将这些函数的声明放在头文件中:

数学。
双f1();
双F2(双);
数学结束。
在其他文件main.cpp,我想打电话给两个功能,所以你只需要包含头文件:

main.cpp / * * /
#包括数学的。
(主)
{
int数= F1();
int 2 = F2(第一);
}
结束main.cpp / * * /
在这种方式中,它是一个完整的程序。应该指出的是,.h文件不编译命令后写成的,但它必须在什么地方可以找到它的编译器(如目录main.cpp),math.cpp main.cpp,可以编译生成主。O和数学。O,然后两目标文件链接,和可运行的程序。
三、#包括
#包括从C语言的宏命令,它在编译器编译的,即,当他们是预编译的,#作用包括是包括,它后面的文件的内容,完全和完整的,并没有修改该文件的内容到当前文件。它是值得一提的是,它本身没有其他函数或函数。它的功能是代替每一个地方,它出现在文档写它背后的内容。简单的文本替换,没有其他的。因此,在main.cpp文件里的第一句话(#包括数学。H )将被取代的数学内容。h文件之前,编译。是的,在编译过程中就要开始的内容已经改变,main.cpp:

~ main.cpp / * * /
双f1();
双F2(双);
(主)
{
int数= F1();
int 2 = F2(第一);
}
最后~ main.cpp / * * /
不多,刚刚好。同样,我们可以看到,如果我们有许多其他.cpp文件除了main.cpp,我们还使用F1和F2的功能。他们还需要写#包括数学,在使用这两个功能。
四。头文件中应该写些什么
从上面的讨论,我们可以看到,标题的作用是包含在other.cpp.they本身不参与编译,但事实上,他们的内容编制多。cpp文件。通过定义规则,只能有一次,我们得到的变量和函数的声明应放在相反他们定义的头文件是很容易的。因为一个标题的内容实际上是引入一些不同。cpp文件,它们被编译。不管是什么公告,如果它提出的概念,它相当于一个符号的定义(变量或函数)在许多文件,甚至虽然这些定义都是一样的,但是编译器,它是非法的。
所以,有一件事要记住的是,只能有一个声明在A H头一个变量或函数,不是一个定义,那只能写在头文件如句子:extern int a;和void f();这些都是声明。如果你写int一;或void f(){ }这句话,所以一旦标题是两个或两个以上的.cpp文件,编译器会立即报错。(约外,前面的论述,不再讨论定义和声明。之间的差异)但有三个例外。
首先,对const对象定义可以写在头文件。因为全局常量对象不是由外部默认情况下宣布,它在当前的文件是唯一有效的。这样一个对象被写入头文件。即使它包含在其他CPP文件中,它只在包含它的文件中有效,而且对其他文件是不可见的,因此它不会导致多个定义。同时,因为这些CPP文件中的对象包含在头文件中,它也确保了这些CPP文件中的const对象的值是相同的。可以说是一举两得,同样,静态对象的定义也可以放在头文件中。
二,inline函数的定义(inline)可以写在头文件中,因为内联函数在遇到根据定义不内联展开编译所需的,和普通的功能,可以链接的第一个语句(没有链接),那么编译器将需要看到内联函数的完整定义仅在编译的时候。如果内联函数只能定义一次像一个普通的功能,很难做到。因为在一个文件,好吧,我可以开始写内联函数的定义,这样我可以看到当我使用它的定义。但是如果我在其他文件中使用这个函数呢这几乎是无解的很好,因此,C++规定,内联函数可以重复程序中定义的内联函数,只要出现在.cpp文件只有一次,而在所有的.cpp文件,内联函数的定义是相同的,可以编译通过。显然,把inline函数的定义在头文件中是非常明智的。
三、写的类(类)中定义的头文件。因为当一个类对象在创建的程序,编译器可以知道这个类的对象应仅在该类的定义是完全可见的,所以在类定义的要求基本上是一样的内联函数相同,所以它是把类的定义在头文件中的一个很好的实践,并包括在头文件。cpp文件,用于这类。在这里,值得一提的是,定义一个类包含数据成员和成员函数,数据成员不需要到特定的对象创建时定义的,但成员函数需要首先定义,这就是我们通常所说的类实现。一般来说,我们的做法是把类的定义在头文件中,并把该成员函数的实现代码在.cpp文件。这是好的,这是一个好办法。有,然而,另一种方式。这是写的函数成员的实现代码直接放在类定义。在C++类中,如果一个成员函数是在类的定义中定义,编译器看为内联函数。因此,它是写一个函数成员的定义为一个类定义和头文件放在一起是合法的。注意,如果你定义的成员函数的定义在类定义的头文件中不是将它写入类定义,而是非法的,因为函数的成员此时不在内部,一旦头文件包含两个或两个以上的CPP文件,函数成员就被重新定义。
五。第一文件中的保护措施
考虑到如果头文件中只包含声明语句,它将由相同的多次重复。cpp文件,因为表不限。然而,在上面讨论的头文件的三个例外,也是一个常用的头文件。然后,一旦一个顶尖的三个例外出现在头文件,它将包含由.cpp多次,问题就大了。因为在这三个例外的语法元素可以在多个源文件中定义,但只有一次在一个源文件。想象一下,如果A H包含类的定义,B H包含类的定义,因为B类的定义取决于类的,所以A. H也包括在B.H.Now有#一个源文件,它同时使用类A和B类。所以程序员都包括A H的源文件,还包括b.h.at这一点,问题来了:类的定义出现在这两次源文件!所以整个程序不能编译,你可能会认为这是程序员的错,他应该知道H包含H,但实际上他不应该知道。
#定义编译条件可以很好的解决这一问题的使用。在头文件中定义的名字,一个是#定义和条件# ifndef编译…# ENDIF,以便编译器可以根据定义的名称,然后再决定是否继续编译头文件中的后续内容。这种方法是简单的,但你必须记住,把它写在头文件。

谢谢你的阅读。我希望你能帮助你,谢谢你对这个站的支持
免责声明:本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕。
相关文章
返回顶部