c++头文件怎么写,c++头文件和源文件区别

  c++头文件怎么写,c++头文件和源文件区别

  通常,在C程序中,只有两种类型的文件:cpp文件和。h文件,前者叫源文本,后者叫头文件,包含所有C代码。

  1.单独编译:

  c语言支持“单独编译”。也就是说,一个程序可以分成不同的功能,放在不同的。cpp文件。一切都在。cpp文件相对独立,编译时不需要和其他文件通信。它只需要在编译成目标文件后与其他目标文件链接。比如在a.cpp中定义了一个全局函数“void a() {}”,这个函数需要在b.cpp中调用,即便如此,a.cpp和b.cpp也不需要知道对方的存在,而是可以分别编译,编译到目标文件中再链接,整个程序就可以运行了。

  1)是如何实现的?

  B.在b.cpp中,在调用“void a()”函数之前,将此函数声明为“void a()”;就行了。这是因为编译器在编译b.cpp时会生成一个符号表,不能定义的符号如“void a()”会存储在这个表中。再次链接时,编译器将在其他目标文件中查找该符号的定义。一旦找到,程序就能顺利生成。

  注意:一个符号可以在整个程序中声明多次,但只能定义一次。试想一下,如果一个符号有两种不同的定义,编译器应该听谁的?

  2)什么是头文件:

  所谓头文件,其实它的内容和。cpp文件,这是c的源代码,头文件本身不需要编译。通常,我们将所有公共变量和函数的声明放在一个头文件中。当某个。cpp源文件需要它们,它们可以包含在此。cpp文件通过一个宏命令“#include”,也就是逐字的替换和复制。当。cpp文件被编译,头文件也随之被编译。举个例子:

  一个方法double f1(double,double);)是在math.h中声明的;f1方法在math.cpp中定义,即实现;在mathMain.cpp中调用这个方法,只需要包含头文件并声明它,这样整个程序就完成了。从上面的例子可以看出,头文件的目的是提供外部接口。

  注意:在。h文件不需要写在编译器的命令之后,但是必须在编译器能找到的地方。Main.cpp和math.cpp可以分别编译生成main.o和math.o,然后把两个目标文件链接起来,程序就可以运行了。

  2.头文件中写了什么:

  2.1)变量和函数的声明:

  头文件的目的是被其他。cpp文件。它们不参与编译,但实际上它们的内容是用几个。cpp文件。通过“定义只能有一次”的规则(否则我们不知道用哪个),我们可以得出结论,头文件中只放变量和函数的声明,而不放它们的定义。

  因为头文件实际上会被引入许多不同的。cpps,而且都会编。当然,放宣言也没问题。如果你把定义(即使是一样的),对编译器来说是非法的。所以你只能在头文件里写类似:extern int a;和void f();这些是陈述。如果你写int a;或者像void f() {}这样的句子,那么一旦这个头文件被两个或多个。cpp文件,编译器会立即报告错误。

  2.2)常量对象的定义:

  const定义的变量可以写入头文件。即使它包含在其他几个。cpp文件,这个对象只在包含它的文件中有效,对其他文件是不可见的,所以不会导致多重定义。同时,因为这些中的对象。cpp文件包含在一个头文件中,这确保了const对象的值在这些。cpp档案也是一样,可以一举两得。

  同样,静态对象的定义也可以放到头文件中,但不建议这样做。因为const不会被修改,而且编译时会被优化,保证内存只有一个副本。但是静态会被修改,导致编译时的非优化,内存中保存了很多副本。所以建议把静态的定义写在cpp里。

  注意:必须定义static的变量声明。

  2.3)内联函数的定义可以写在头文件中:

  因为内联函数需要编译器在遇到它的地方根据它的定义进行内联扩展,而不是像普通函数一样在链接前声明(内联函数不链接),所以编译器需要在编译时看到内联函数的完整定义。如果内联函数像普通函数一样只能定义一次,那就很难了。因为在一个文件里没事,所以我可以把内联函数的定义写在开头,这样以后用的时候就能看到定义了;但是如果我在其他文件中使用这个函数呢?这几乎不是一个好的解决方案,所以C规定一个内联函数可以在一个程序中定义多次。只要内联函数在. cpp文件中只出现一次,并且该内联函数的定义在所有文件中都是相同的。cpp文件,可以编译。显然,将内联函数的定义放在头文件中是明智的。

  2.4)类的定义可以写在头文件中:

  当在程序中创建类对象时,只有当类的定义完全可见时,编译器才能知道类对象应该如何布局。因此,对类定义的要求与内联函数的要求基本相同。因此,将类的定义放在头文件中并将头文件包含在。用于此类的cpp文件。这里值得一提的是,类的定义包含数据成员和函数成员。在创建具体对象之前不会定义数据(分配空间),但是函数成员需要在一开始就定义,也就是我们通常所说的类的实现。

  通常,我们的方法是将类的定义放在头文件中,将函数成员的实现代码放在. cpp文件中。这是可能的,也是一个好办法。(外联)

  但是,还有一种方法是直接将函数成员的实现代码写入类定义中。在C的类中,如果在类的定义体中定义了一个函数成员,那么编译器会将这个函数视为内联的。因此,将函数成员的定义写入类定义体并一起放在头文件中是合法的。

  注意:如果函数成员的定义是写在类定义的头文件中,而不是写在类体定义中,这是非法的,因为这个函数成员此时不是内联的。一旦头文件被两个或多个。cpp文件,这个函数成员被重新定义。

  3.头文件保护:

  所有头文件都应该使用#define来防止头文件的多重包含。命名格式应该是:项目路径文件H

  为了确保唯一性,头文件的命名应该基于项目源代码树的完整路径。示例:项目foo中的头文件foo/src/bar/baz.h可以保护如下:

  #ifndef FOO_BAR_BAZ_H_

  #定义福酒吧BAZ H _

  .

  #endif //FOO_BAR_BAZ_H_3.1)由于一个系统中会有很多头文件,这些头文件可能都包含一个公共头文件。如果没有头文件保护,将会发生错误。举个例子:

  //file1.h

  类别文件1

  {

  };

  //file2.h

  #include file1.h

  类别文件2

  {

  };

  //file3.h

  #include file1.h

  #include file2.h

  3.文件3.h扩展如下:

  //file 1 . h的扩展内容

  类别文件1

  {

  };

  //file 2 . h的扩展内容

  类别文件1

  {

  };

  类别文件2

  {

  };这个时候就会有重新定义。如果每个文件都添加了#ifndef头文件保护程序:

  //file1.h

  #ifndef _FILE1_H_

  #define _FILE1_H_

  类别文件1

  {

  };

  #endif //!_FILE1_H_

  //file2.h

  #ifndef _FILE2_H_

  #define _FILE2_H_

  #include file1.h

  类别文件2

  {

  };

  #endif //!_文件2_H_

  //file3.h

  #ifndef _FILE3_H_

  #define _FILE3_H_

  #include file1.h

  #include file2.h

  #endif //!_FILE3_H_此时扩展file3.h时,因为_FILE1_H_只会定义一次,所以不会出现重定义错误。

  3.2)头文件保护仅防止在同一个。cpp文件:

  一般不允许在头文件中定义变量和函数(只允许声明)。如果变量和函数是在头文件中定义的,但是只由带有main的cpp引入和执行,那就没有问题。例如:

  Test.cpp可以便宜,可以连接,可以执行。但是,如果头文件包含在两个或多个CPP中,则会报告重复定义错误:

  Test1.cpptest _ main.cpp在编译和连接时会报告以下错误:

  这是因为#ifndef在同一个文件中只能起到保护作用。连接时,test()函数的定义同时出现在test1和test_main中。上面的代码可以编译成功:g-sstest1.cpptest _ main.cpp。

  解决方案,可以将common.h中的test()改为一个内联函数,即:inline void test()

  3.3)#ifndef也可以在cpp文件中使用:

  这种用法很少见,不推荐使用。#ifndef只是放在头文件中作为头文件的保护。下面的例子可以编译并成功连接:gtest1.cpptest _ main.cpp。

  定义了宏TEST_COMMON_H_并在头文件和test1.cpp中用#ifndef保护所以G编译链接时不会报错重复预定会议。

  原创作品来自正在路上的博主,转载请联系作者获得转载授权,否则将追究法律责任。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • office2010激活密钥大全 怎么永久激活office2010
  • project2010产品密钥免费_project2010激活密钥永久激活码
  • c语言调用退出函数 c语言退出整个程序怎么写
  • c语言中怎么给函数初始化 c语言的初始化语句
  • c语言编写函数计算平均值 c语言求平均函数
  • chatgpt是什么?为什么这么火?
  • ChatGPT为什么注册不了?OpenAI ChatGPT的账号哪里可以注册?
  • OpenAI ChatGPT怎么注册账号?ChatGPT账号注册教程
  • chatgpt什么意思,什么是ChatGPT ?
  • CAD中怎么复制图形标注尺寸不变,CAD中怎么复制图形线性不变
  • cad中怎么创建并使用脚本文件,cad怎么运行脚本
  • cad中快速计算器的功能,cad怎么快速计算
  • cad中快速修改单位的方法有哪些,cad中快速修改单位的方法是
  • cad中心点画椭圆怎么做,cad轴测图怎么画椭圆
  • CAD中常用的快捷键,cad各种快捷键的用法
  • 留言与评论(共有 条评论)
       
    验证码: