c++中的头文件有哪些,c的头文件是什么
在C编程的过程中,随着项目越做越大,代码会越来越多,管理和分析都很困难。因此,标题(。h)文件和实现(。cpp)文件在C中会被分开,包的概念也就应运而生了。
对于C开头的,C#是我的“母语”。刚开始跟导师学C,对这方面还是感觉很模糊。虽然我可以用C的知识面对C的语法规范,用C#的思想理解C中类的使用。但是C#里的定义和实现都在一个文件里(其实都在类里),而用C的时候只是编程的开始,写出来的程序只需要一个文件就够了。因此,我总是纠结于对C和。h文件和。cpp文件。
好在导师有详细的PPT让我了解,一旦了解了Package,就更明白了。简单地说,一个包包括。h和。同名的cpp文件。当然,这些文件中的任何一个都可以省略:只有。h文件可以是接口或模板的定义;只有一包。cpp文件可以是一个程序的入口。
当然,更详细的讲解请下载导师的教学PPT-Package了解更多。
但我在这里想说的是。h文件和。cpp文件。
认识包只是一个相对宏观的认识:我们在项目中以包为编辑对象,对我们的程序进行扩展和修改。在编写代码时,它特定于应该在。h文件以及应该在。cpp文件。我又迷茫了。
虽然Google给了我很多链接,但是大多数解释都太笼统了:声明写在。h文件,定义实现写在。cpp文件。这个解释没有错,但是当你真正开始的时候,你会发现你不知道在哪里打代码。
于是我把这个问题抛给了我的导师,导师很耐心的给我详细讲解了c中如何分离代码,可惜我第一次听,不太懂。另外我对C不是很了解,所以印象不深。
经过几个项目的尝试和体验,我把这个问题拿出来问导师。他又耐心的给我解释了一遍(我发誓他绝对没有忘记我曾经问过同样的问题),这次我录了下来。
为了不忘记,我在这里总结一下。
概述非模板类型(none-template)模板类型(。h)头文件声明全局变量(用extern限定符)声明全局函数定义用inline限定符声明和定义全局模板函数用inline限定符声明类函数成员和数据成员(在类内)定义类定义内的函数(相当于inline 在类内用静态const限定符初始化数据成员用内联限定符定义外部函数定义模板类的定义模板类成员的声明和定义(定义可以放在类内也可以放在类外,但不需要在类外写内联)实现文件(。 cpp)全局变量的定义(和初始化)全局函数的定义(无)类函数成员的定义用静态限定符初始化数据成员*声明:声明
*定义:定义
头文件的所有内容都必须包含在
#ifndef{Filename}
#定义{文件名}
//{头文件的内容}
#endif这可以确保当头文件被多个其他文件包含时,内部数据不会被多次定义,从而导致错误。
内联限定符在头文件中。您可以对函数使用内联限定符来通知编译器。这个函数非常简单,可以直接嵌入到调用定义中。
当然,内联的函数不一定被编译器实现为内联。如果函数太复杂,编译器也会拒绝内联。
所以,简单来说,最好是让代码短到3-5行作为内联。不要使用循环、分支和递归函数作为内联函数。
对于在类定义中定义和实现的函数,编译器自动将它们视为内联请求(不一定是内联的)。因此,在下文中,我将带有内联限定符的函数成员和那些写在类定义体中的成员称为“要内联的函数成员”。
非模板全局类型就像前面提到的通用词:声明是用。h文件。
对于函数来说,没有实现者的函数相当于声明;对于数据类型(包括基本类型和自定义类型),它们的声明需要用extern修饰。
然后在。cpp文件。
但是导师一再强调,不允许使用全局函数和全局变量。使用后的后果,目前来看就是上交的作业项会被扣分。当然,你也不能用自己不能用的理由和解决方法,但这不在当前讨论的范围之内。
自定义类型对于自定义类型,包括类和结构,它们的定义放在。h文件。其成员的声明和定义更复杂,但从上表可以清楚地看出。
函数成员的声明,不管它们是否有静态限定符,都放在。h文件。
要内联的函数成员的定义放在。h档;其他函数的实现放在。cpp文件。
数据成员的声明和定义放在。h文件。对于数据类型,关键问题是在哪里初始化它们。
对于只有静态限定符的数据成员,其初始化应该放在。cpp文件。因为它对所有类对象都是通用的,所以必须正确初始化。
对于只有const限定符的数据成员,其初始化只能在构造函数的初始化列表中完成。因为一旦初始化就不能重新赋值,所以也必须正确初始化。
对于同时具有static和const限定符的数据成员,其初始化和定义是同时进行的。它还必须正确初始化。
对于一个既没有static也没有const限定符的数据成员,它的值只能针对这个对象随意修改,所以我们不关心它的初始化什么时候发生。
在C类型中,template是一个开发工具,类似于C#和Java泛型,但又与它们不同。以前我一直认为,泛型、模板之类的东西,我这辈子可能永远用不到。但是在导师的强制下,我真的体会到了模板的强大,也真的知道了怎么用,更进一步怎么设计。但这个不是三言两语能说完的,我就不多说了。
对于模板来说,最重要的一点是,当它被定义时,编译器不会编译它,因为它没有可用的实体。
只有在模板被专门化后(在特定类型上使用),编译器才会根据特定类型编译模板。
所以我们在定义模板的时候,发现编译器基本不报错(我当时还是很高兴的:我会一气呵成的写出没有错误的代码),也做不出智能提示。但具体用在一个班级的时候,会出现大块的错误,但往往无法准确定位。
所以设计模板有一套设计模板的思路和方法,但这也和本文的主题有偏差。
由于模板的特殊性,它没有自己确切的定义,所以我们不能把它放在。cpp文件,但是将它们都放在。h文件进行写入。这也是为了让编译器能够在模板被物化的时候,找到模板的所有定义在哪里,从而真正定义方法。
至于模板类函数成员的定义放在哪里,导师的意见是放在类定义之外,因为这样你看类的时候一看就知道有什么方法和数据了;我在用Visual Studio的时候,看到了它的标准库的实现,都放在类里面。
可能是习惯了C#的风格,更喜欢全部写在类内部。还有,在开发过程中,使用的所有编辑器都有一个强大的功能:代码折叠。
当然,之所以写在课外,还有其他原因。对于每个函数成员的实现,有必要将模板类型写成一个限定符,同时也要写类名限定符。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。