精华内容
下载资源
问答
  • 头文件怎么写
    千次阅读
    2018-09-10 15:57:13

    用于学习记录

    谭浩强的142页,关于头文件的说明:头文件是个模块之间的接口文件。

    好的头文件应该包含以下一些内容:

    (1)类型定义

    例如结构体、枚举,这两种类型在TI2000DSP的头文件中很常见。

    (2)函数声明

    一个头文件对应一个C文件,该C文件中定义的函数,都要在这个头文件中做外部声明,因为这个函数可能被其他的c文件里面的函数引用。

    (3)数据的声明

    数据声明,我理解为变量的声明,注意是声明,不是定义。例如有个变量,不是在这个头文件对应的C文件里面定义的,但是却要用它,这个变量就应该在这个头文件里面做一下外部声明。

    (4)常量的定义

    这个不能理解

    (5)包好命令

    即包含其他的头文件

    (6)宏定义

    (7)注释

    头文件不能包含以下内容

    一般函数定义,数据定义,常量聚集定义。

     

     

     

    更多相关内容
  • c++头文件应该怎么点什么

    千次阅读 2020-09-13 21:20:15
    而.h文件则被称作C++头文件,里面放的也是C++的源代码。 C+ +语言支持“分别编译”(separate compilation)。也就是说,一个程序所有的内容,可以分成不同的部分分别放在不同的.cpp文件里。.cpp文件里的东西都是...

    一、C++编译模式

    通常,在一个C++程序中,只包含两类文件——.cpp文件和.h文件。其中,.cpp文件被称作C++源文件,里面放的都是C++的源代码;而.h文件则被称作C++头文件,里面放的也是C++的源代码。
    C+ +语言支持“分别编译”(separate compilation)。也就是说,一个程序所有的内容,可以分成不同的部分分别放在不同的.cpp文件里。.cpp文件里的东西都是相对独立的,在编 译(compile)时不需要与其他文件互通,只需要在编译成目标文件后再与其他的目标文件做一次链接(link)就行了。比如,在文件a.cpp中定义 了一个全局函数“void a() {}”,而在文件b.cpp中需要调用这个函数。即使这样,文件a.cpp和文件b.cpp并不需要相互知道对方的存在,而是可以分别地对它们进行编译, 编译成目标文件之后再链接,整个程序就可以运行了。
    这是怎么实现的呢?从写程序的角度来讲,很简单。在文件b.cpp中,在调用 “void a()”函数之前,先声明一下这个函数“void a();”,就可以了。这是因为编译器在编译b.cpp的时候会生成一个符号表(symbol table),像“void a()”这样的看不到定义的符号,就会被存放在这个表中。再进行链接的时候,编译器就会在别的目标文件中去寻找这个符号的定义。一旦找到了,程序也就可以 顺利地生成了。

    这 种机制给C++程序员们带来了很多好处,同时也引出了一种编写程序的方法。考虑一下,如果有一个很常用的函数“void f() {}”,在整个程序中的许多.cpp文件中都会被调,一个函数还 好对付,声明起来也就一句话。但是,如果函数多了,比如是一大堆的数学函数,那怎么办?能保证每个程序员都可以完完全全地把所有函数的形式都 准确地记下来并写出来吗?

    二、什么是头文件

    很显然,答案是不可能。但是有一个很简单粗暴地办法,可以帮助程序员们省去记住那么多函数原型的麻烦:我们可以把那几百个函数的声明语句全都先写好,放在一个文件里,等到程序员需要它们的时候,就把这些东西全部copy进他的源代码中。
    这 个方法固然可行,但还是太麻烦,而且还显得很笨拙。于是,头文件便可以发挥它的作用了。所谓的头文件,其实它的内容跟.cpp文件中的内容是一样的,都是 C++的源代码。但头文件不用被编译。我们把所有的函数声明全部放进一个头文件中,当某一个.cpp源文件需要它们时,它们就可以通过“#include”包含进这个.cpp文件中,从而把它们的内容合并到.cpp文件中去。当.cpp文件被编译时,这些被包含进去的.h文件的作用便发 挥了。
    举一个例子吧,假设所有的数学函数只有两个:f1和f2,那么我们把它们的定义放在math.cpp里:

    /* math.cpp */
    double f1()
    {
        //do something here....
        return;
    }
    double f2(double a)
    {
        //do something here...
        return a * a;
    }
    /* end of math.cpp */
    
    并把“这些”函数的声明放在一个头文件math.h中:
    /* **math.h** */
    double f1();
    double f2(double);
    /* end of math.h */
    
    在另一个文件main.cpp中,我要调用这两个函数,那么就只需要把头文件包含进来:
    /* main.cpp */
    #include "math.h"
    main()
    {
        int number1 = f1();
        int number2 = f2(number1);
    }
    /* end of main.cpp */

    这 样,便是一个完整的程序了。需要注意的是,.h文件要在编译器找得到的地方(比如跟main.cpp在一个目录下)。 main.cpp和math.cpp都可以分别通过编译,生成main.o和math.o,然后再把这两个目标文件进行链接,程序就可以运行了。

    三、#include

    说明:#include 是一个来自C语言的宏命令,它在编译器进行编译之前,即在预编译的时候就会起作用。#include的作用是把它后面所写的那个文件的内容,完完整整地、 一字不改地包含到当前的文件中来。简单的文本替换,别无其他。因此,main.cpp文件中的第一句(#include “math.h”),在编译之前就会被替换成math.h文件的内容。即在编译过程将要开始的时候,main.cpp的内容已经发生了改变:

    /* ~main.cpp */
    double f1();
    double f2(double);
    main()
    {
        int number1 = f1();
        int number2 = f2(number1);
    }
    /* end of ~main.cpp */

    其他的.cpp文件也用到了f1和f2函数的话,那么它们也通通只需要在使用这两个函数前写上一句#include “math.h”就行了。

    四、头文件中应该写什么

    通 过上面的讨论,我们可以了解到,头文件的作用就是被其他的.cpp包含进去的。它们本身并不参与编译,但实际上,它们的内容却在多个.cpp文件中得到了编译。通过“定义只能有一次”的规则,我们很容易可以得出,头文件中应该只放变量和函数的声明,而不能放它们的定义。因为一个头文件的内容实际上是会被引 入到多个不同的.cpp文件中的,并且它们都会被编译。如果放了定义,那么也就相当于在多个文件中出现了对于一个符号(变量或函数)的定 义,纵然这些定义都是相同的,但对于编译器来说,这样做不合法。
    即,只能在头文件中写形如:extern int a;和void f();的句子。这些才是声明。如果写上int a;或者void f() {}这样的句子,那么一旦这个头文件被两个或两个以上的.cpp文件包含的话,编译器会立马报错。(关于extern,前面有讨论过,这里不再讨论定义跟声明的区别了。)
    但是,这个规则是有三个例外的。
    一,头文件中可以写const对象的定义。因为全局的const对象默 认是没有extern的声明的,所以它只在当前文件中有效。同时,因为这些.cpp文件中的该对象都是从一个头文件中包含进去的,这样也就保证 了这些.cpp文件中的这个const对象的值是相同的,可谓一举两得。同理,static对象的定义也可以放进头文件。
    二,头文件中可 以写内联函数(inline)的定义。因为inline函数是需要编译器在遇到它的地方根据它的定义把它内联展开的,而并非是普通函数那样可以先声明再链 接的(内联函数不会链接),所以编译器就需要在编译时看到内联函数的完整定义才行。如果内联函数像普通函数一样只能定义一次的话,这事儿就难办了。因为在 一个文件中还好,我可以把内联函数的定义写在最开始,这样可以保证后面使用的时候都可以见到定义;但是,如果我在其他的文件中还使用到了这个函数那怎么办 呢?这几乎没什么太好的解决办法,因此C++规定,内联函数可以在程序中定义多次,只要内联函数在一个.cpp文件中只出现一次,并且在所有的.cpp文 件中,这个内联函数的定义是一样的,就能通过编译。那么显然,把内联函数的定义放进一个头文件中是非常明智的做法。
    三,头文件中可以写类 (class)的定义。因为在程序中创建一个类的对象时,编译器只有在这个类的定义完全可见的情况下,才能知道这个类的对象应该如何布局,所以,关于类的 定义的要求,跟内联函数是基本一样的。所以把类的定义放进头文件,在使用到这个类的.cpp文件中去包含这个头文件,是一个很好的做法。在这里,值得一提的是,类的定义中包含着数据成员和函数成员。数据成员是要等到具体的对象被创建时才会被定义(分配空间),但函数成员却是需要在一开始就被定义的,这也就 是我们通常所说的类的实现。一般,我们的做法是,把类的定义放在头文件中,而把函数成员的实现代码放在一个.cpp文件中。这是可以的,也是很好的办法。 不过,还有另一种办法。那就是直接把函数成员的实现代码也写进类定义里面。在C++的类中,如果函数成员在类的定义体中被定义,那么编译器会视这个函数内联的。因此,把函数成员的定义写进类定义体,一起放进头文件中,是合法的。注意一下,如果把函数成员的定义写在类定义的头文件中,而没有写进类定义中, 这是不合法的,因为这个函数成员此时就不是内联的了。一旦头文件被两个或两个以上的.cpp文件包含,这个函数成员就被重定义了。
    五、头文件中的保护措施
    注意上面提到的三个例外不能直接或间接的被同一个cpp文件包含,设想一下,如果a.h中含有类A的定义,b.h中含有类B的定 义,由于类B的定义依赖了类A,所以b.h中也#include了a.h。现在有一个源文件,它同时用到了类A和类B,于是程序员在这个源文件中既把 a.h包含进来了,也把b.h包含进来了。这时,问题就来了:类A的定义在这个源文件中出现了两次!于是整个程序就不能通过编译了。你也许会认为这是程序 员的失误——他应该知道b.h包含了a.h——但事实上他不应该知道。
    使用”#define”配合条件编译可以很好地解决这个问题。在一个头文件中,通过#define定义一个名字,并且通过条件编译#ifndef…#endif使得编译器可以根据这个名字是否被定义,再决定要不要继续编译该头文中后续的内容。这个方法虽然简单,但是写头文件时一定记得写进去。

    展开全文
  • 本文介绍了C语言头文件的编写问题以及引用方法。
  • 将类头文件

    2022-01-25 10:39:17
    把类的声明都在h里面,方法的实现在cpp里面,然后在main.cpp内#include “ABC.h”,然后编译,如果是工程就把ABC都加到工程里,如果不是就要手动链接了。 头文件只是提供声明,#include了头文件是保证main.cpp...

    比如有个类ABC要在main.cpp内使用,创建两个文件 ABC.h,ABC.cpp。
    把类的声明都写在h里面,方法的实现写在cpp里面,然后在main.cpp内#include “ABC.h”,然后编译,如果是工程就把ABC都加到工程里,如果不是就要手动链接了。
    头文件只是提供声明,#include了头文件是保证main.cpp知道了接口。而链接才是把类ABC的代码加入到生成的可执行文件中。既要知道接口有要代码实现,才能使用ABC。
    最好将类的声明放在.h文件,类的定义放在.cpp文件,如若将类的声明和定义都放在.h文件,当多个文件同时包含这个.h文件会出现建置错误,因为你重复定义了。正确格式如下:

     

    展开全文
  • 先来做一个实验,你在一个头文件中定义一个类,然后把内中的一个函数的实现在这个头文件当中。 //A_test.h #ifndefine _A_TEST_ #define _A_TEST_ class A { void test(); }; void A::test() { } #endif //A_...

    先来做一个实验,你在一个头文件中定义一个类,然后把内中的一个函数的实现写在这个头文件当中。

    //A_test.h

    #ifndefine _A_TEST_
    #define _A_TEST_
    class A
    {
    void test();
    };
    
    void A::test()
    {
    }
    #endif
    

    //A_test.cpp

    #include A_test.h
    

    //B_test.cpp

    #include A_test.h
    

    //C_test.cpp

    #include A_test.h
    
    • 然后在两个B.cpp,C.cpp包含这个头文件,请问能否编译通过。答案是不行的,会报错,所你重复定义函数test()

    • 但是如果你把这个函数定义到class A里面,然后编译就不报错了。

    • 另外如果你把这个函数定义在这个头文件类的外面,但是前面加上inline,也可以通过编译。

    • 除此之外,如果你把这个函数的实现写在另外一个包含这个头文件的cpp文件中,也可以通过编译,这也是最规范的写法。

    • 与此对应,如果你在这个头文件中声明了一个函数,如果直接就在这个头文件中实现,那么除非你把它定义为inline 函数,不然会发生二次定义的错误,当然把一个实现放到一个对应的cpp中,自然不会报错。

    • 在常规理解中,.h只能写声明,cpp写实现。这是很规范 。但是为什么有些库的头文件也把一些类的实现写出来了,有些函数也直接定义在那个头文件中,在很多.cpp中也不断的被包含呢,结果并不报错。举个例子来时,complex.h这个头文件在很多数值.cpp中间都要包含,如果这个头文件中有些函数写了实现,就会报错。

    • 那么究竟如何来理解这种现象呢,有3点:

    1. 是编译器的唯一命名规则,就是inline函数,class和模板类函数被多次包含的情况下,在编译的时候,编译器会自动把他们认为是同一个函数,不会发生二次定义的问题。前提是他们一模一样。

    2. 是编译器会把class里面定义的函数当做inline函数,所以直接在类里面实现函数的定义没有关系。由上面的说明,他不会发生二次定义的问题。

    3. 一般函数的声明和实现分开,在编译的时候,声明可以无数次,但是定义只能一份,只会生成一份函数的.obj,所以有函数调用的地方,编译器必须在调用的地方先保持现场,然后在花点时间去调用函数,然后回来,恢复现场。所以函数在头文件中实现,如果被包含二次。函数的实现就被编译了2次,如果单独写在一个.cpp中间,自然就编译成为一份.obj,不会产生二义性的问题。
      inline函数在编译的时候直接复制在有该函数的地方,在空间上有消耗,但是在省去了时间上的消耗,是一个模板函数。也就是说在有这些函数的地方都不需要去调用函数,也就不涉及有2种函数可以调用产生的二义性问题。

    • 注意:
      A.cpp和B.cpp两个源文件都包含了head.h的头文件时,条件编译不会起到作用。这也就意味着如果头文件中定义了类外的函数或者全局变量,那么当多个源文件同时包含这一头文件时,会发生重复定义的错误。

    https://blog.csdn.net/qq_40765537/article/details/105946790
    https://blog.csdn.net/dengm155/article/details/51692285
    https://blog.csdn.net/qq_34809033/article/details/80652116

    展开全文
  • C语言头文件里可以些什么

    千次阅读 2019-08-08 16:57:34
    文章目录C语言头文件里可以些什么 C语言头文件里可以些什么 1、头文件卫士:#ifndef #define #endif搭配,防止头文件被重复包含 2、可以定义结构、联合、枚举、宏、变量 3、可以定义头文件对应的.c文件中的函数...
  • ,,,
  • 头文件的编写

    千次阅读 2021-07-29 18:52:22
    一、头文件中应该什么: 问题:头文件可能被任何的源文件包,意味着头文件的内容会在多个目标文件中存在,合并时要保证不能冲突 重点:头文件中只能编写声明语句,不能有定义语句 全局变量声明 extern int num; ...
  • python 头文件怎么

    千次阅读 2021-02-10 06:01:09
    首先介绍一下Python头文件的编程风格,然后再给大家详细介绍import部分的基本用法。这两个部分就是Python中头文件的组成模块。编程风格#!/usr/bin/envpython#在文件头部(第一行)加上设置Python解释器#-*-coding:utf-...
  • 如何C语言的头文件

    2018-10-02 16:49:18
    这是一篇简单明了的介绍C语言中如何编写头文件的文章。
  • 头文件led.h 内容开头必须上: #ifndef __LED_H // 如果之前没有定义过 __LED_H #define __LED_H //那么就定义 __LED_H 第三步: 可以明确列出需要包含的内容 比如:系统头文件 函数声明 宏定义 结构体声明 … ...
  • wav头文件

    2016-08-11 11:14:41
    将wav头信息直接成data文件
  • 点击蓝字关注我吧像...有时候我们常常想,为什么这些模块类函数没有类似reg51.h、reg52.h等的头文件可以用,直接在程序开头包含头文件,主程序引用就行?其实是可以的,C语言的编程是相当灵活的,这里我们自己可...
  • c++头文件怎么

    千次阅读 2021-02-06 10:54:27
    头文件:包括结构声明和使用这些结构的函数的原型。头文件一般包含类的定义、 extern 变量的声明和函数的声明. 源代码文件:包含与结构有关的函数的代码。 源代码文件:包含调用上述函数的代码。 不要把函数的定义...
  • Makefile中依赖文件要不要写头文件

    千次阅读 多人点赞 2017-08-23 16:08:44
    这段时间在学习Makefile,发现之前很多遇到的makefile依赖文件中都没有头文件,但是后来在系统学习的时候,发现书上经常把头文件写进Makefile的依赖文件中,我就特别好奇到底依赖文件中需不需要写头文件呢?...
  • C51中常用头文件

    千次阅读 2019-12-19 13:46:11
    C51中常用头文件 C51中头文件很多,包括reg51.h或reg52.h、absacc.h、math.h、intrins.h、stdio.h、stdlib.h等。但是常用的通常只有reg51.h或reg52.h、absacc.h、math.h这三个头文件。 (1)reg51.h或reg52.h 这...
  • 本页收集了一些在VC++中进行HID设备读写的头文件:hid.lib hidpi.h hidsdi.h setupapi.lib targetver.h,需要时请引入这些头文件,链接库也要加入,至于怎么加入,百度就OK了,另附压缩包内附有一张示例图,告诉你...
  • inline修饰的函数可以存在多个副本,所以你可以在头文件中用inline定义一个全局函数,然后在多个源文件。C++中,类声明中直接定义的成员函数,都被当从inline函数,所以不会造成“重定义”,这解释了文章开头的。...
  • python 引入 导入 自定义模块, python 引入 导入 外部文件python 引入 ...那么你新建一个app,把你需要导入的说用东东,都到这个app中,然后在setting中的app也配上基本就ok了如果是本地代码,可以有几种方式,1...
  • 1、使用头文件 在创建了头文件之后,只要把他的...1、如果头文件与程序文件在同一个子目录里,则可以这么: linux系统:#include"./fishc.h" 熟悉linux的都知道,./表示当前目录 windows系统:#include".\fishc.h
  • 只有头文件必须用到的放到头文件头文件中可以使用前置声明来代替。或者所有cpp都用到的也可以放到头文件。 哪里用到就放哪里,谁用谁包含。 一般是默认放在cpp里,之后如果出现.h也用了,再把cpp中的删了。 2,...
  • C 头文件怎么

    千次阅读 2021-05-21 05:51:54
    一些初学C语言的人,不知道头文件(*.h文件)原来还可以自己的。只知道调用系统库函数时,要使用#include语句将某些头文件包含进去。其实,头文件跟.C文件一样,是可以自己的。头文件是一种文本文件,使用文本...
  • 函数的声明放在头文件
  • c++如何写头文件

    2020-02-04 21:07:09
    而.h文件则被称作C++头文件,里面放的也是C++的源代码。 C+ +语言支持“分别编译”(separate compilation)。也就是说,一个程序所有的内容,可以分成不同的部分分别放在不同的.cpp文件里。.cpp文件里的东西都是...
  • GCC 找头文件有三种策略:1. 会在默认情况下指定到 /usr/include 文件夹 ( 更深层次的是一个相对路径, GCC 可执行程序的路径是 /usr/bin ,那么它在实际工作时指定头文件头径是一种相对路径方法,换算成绝对路径...
  • C语言头文件到底是什么?

    千次阅读 2021-05-20 16:38:28
    C语言头文件到底是什么?在C语言学习的时候总是会引入这样的语句#include ,书上解释说把stdio.h这个文件的全部内容直接插入到这个位置,然后再经过C语言的编译器编译运行。这么看来隐含的意思好像是.h头文件好想并...
  • (二)C++头文件与类的声明

    千次阅读 2022-04-15 21:28:07
    了解C++中一个基本的头文件,和主文件中使用的声明具体格式。对头文件进行格式说明和讲解。
  • python头文件怎么

    千次阅读 2020-12-29 02:20:12
    1.python编辑时可以不要头文件吗win下py代码,头文件是#-*-encoding:utf-8-*-,是告诉python解释器, 应该以utf-8编码来解释py文件, 对于python 2.6/...linux下,头文件需要#! /usr/bin/env python。加上这行, ...
  • C++如何自定义的头文件

    千次阅读 2022-07-28 15:51:26
    C++是一种非常热门的面向对象语言,受到很多人的欢迎。在C语言的基础上,C++进行了很多的改进,并引入了许多新的头文件,...这时候有些人就会想到,如果自己写头文件,那岂不是方便多了?别急,这篇文章来帮你。......
  • leetcode能不能引入头文件 个人文章 公众号文章(时间排序) 2019年 10月 9月 8月 7月 6月 5月 公众号二维码

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 398,409
精华内容 159,363
关键字:

头文件怎么写