头文件_文件头 - CSDN
  • C头文件stdlib.h

    2020-07-30 23:32:48
    C的头文件,在网上找的,我想应该有人需要吧。。。。
  • 之前对C语言的头文件和宏定义抱着一知半解的态度,现理清思路并以文字的形式整理出来,以供不时之需 头文件 头文件,顾名思义就是定义在C语言文件头部的那一坨东西 #include 这就是一个标准输入输出的...

    之前对C语言的头文件和宏定义抱着一知半解的态度,现理清思路并以文字的形式整理出来,以供不时之需

    头文件

    头文件,顾名思义就是定义在C语言文件头部的那一坨东西

    #include <stdio.h>

    这就是一个标准输入输出的头文件声明,头文件声明写在定义文件(后缀名.c的文件)的头部,并在定义文件中具体实现

    #include <stdlib.h>
    #include "mylib.h"

    这是两种声明头文件的方法,其中尖括号表示“到环境指定的目录去引用”,而双引号表示“首先在当前目录查找,然后在到环境指定的目录去引用”
    在C表准库中每个库函数都在一个头文件中声明,可以通过第一种方式引用

    头文件的格式

    #ifndef _MYLIB_H_
    #define _MYLIB_H_
    ...
    #endif
    

    第一句“ifndef”意思是“如果在导入头文件的文件中之前没有导入该头文件就编译下面的代码”,该句的作用是防止重复导入
    第二句“define”是“宏定义”的意思,表示以下代码是的头文件主体部分
    最后来一句“endif”和“ifdef”首尾呼应
    其中“ifndef”和“define”后面跟的是相同的“标识”,通常和头文件名相同,所有字母均大写并把点号改为下划线即可

    #include "mylib.h"

    看到这句话后编译器会把该头文件“mylib.h”复制粘贴到导入的文件中,之后你就可以使用头文件中定义的常量和结构定义了

    显然恰当地使用头文件有利于更好的组织文件和项目

    提请注意
    1. 头文件只是声明,不占内存;在编译时会被合并到源文件
    2. 头文件和其它C语言文件一样可以引用其它文件,可以写预处理块但是不要出现具体语句
    3. 可以在头文件中定义宏函数,其本质上还是一个声明
    4. 各个头文件相互独立,标准头文件之间不存在相互包含关系
    5. 头文件可以重复引用,但是相当于只导入一次
    6. 从C语法角度讲完全可以在头文件中写任何东西,因为#include在作用上和Ctrl-C + Ctrl-V等效——但是这样时不推荐的;头文件的作用就是更好的组织代码

    何时使用
    1. 结构体的定义
    2. 函数声明,变量声明,宏定义,常数定义等
    3. 当源代码不便公布时使用头文件提供接口
    4. 在大项目中需要多文件联合编译

    小栗子

    #ifndef _NODE_H_
    #define _NODE_H_
    
    typedef struct _node{
        int value;
        struct _node *next;
    }Node;
    
    #endif
    #include "node.h"
    int main(int argc, char const argv[])
    {
        Node *p=(Node*)malloc(sizeof(Node));
        ...
        return 0;
    }

    常用头文件

    stdio.h 标准输入输出
    stdlib.h 标准常用库
    string.h 字符串函数库
    math.h 数学库
    ctype.h 字符函数库
    time.h 时间库
    windows.h 微软视窗库


    宏定义

    宏定义是C语言提供的三种预处理功能的其中一种,这三种预处理包括:宏定义、文件包含、条件编译。宏定义和操作符的区别是:宏定义是替换,不做计算,也不做表达式求解。
    “宏定义”也称“宏替换”,“宏”

    define PI 3.1415926

    这就是一个简单的宏,在程序的预处理阶段宏名会被替换为后面的字符串

    传入参数的宏

    1. #:字符串化操作,即将宏定义中的传入参数名转换成用一对双引号括起来参数名字符串,使用时置于宏定义体中的参数名前,如:

    #define func(para)  #para
    ...
    char str[]=func(hello); //被展开为:char str[]="hello"

    说明:如果传入的参数之前有空格则忽略之,如果参数之间有多个空格则在连成字符串时只算一个

    2. #@:字符化操作,即将宏定义传入的参数名转换为用一对单引号扩起来的参数名字符串,使用时置于参数名前,如:

    #define fun(pa) #@pa
    char a=fun(a); //被展开为char a='a';

    3. ##:参数连接操作,即将宏定义的多个形参连接成一个实际参数,如:

    #define COMMAND(a,b) a##b
    ...
    COMMAND(1,2); //相当于12
    CMOOAND(ac,b); //相当于acb

    4. \:当前行继续操作,实际上是对换行符转义,如:

    #define LOOP(FROM, TO, CONTENT)\
    for(int i=FROM;i<TO;i++){\
    CONTENT\
    }

    5. _VA_ARGS_:变长参数操作,即可以接受不定个数的参数,如:

    #define eprintf(...) fprintf (stderr, __VA_ARGS__)
    eprintf ("%s:%d: ", input_file, lineno)
    //==>  fprintf (stderr, "%s:%d: ", input_file, lineno)

    为什么要使用宏定义
    简而言之,使用宏定义可以提高代码的可读性
    具体的说,可以减少magic number的使用,并且可以做一些方便的替换,如下面的代码:

    #define MALLOC(n, type) (type*)malloc((n)*sizeof(type))

    使用时,int *p=MALLOC(10, int); 即可

    宏的规范写法
    1. 宏名大写
    2. 宏定义语句末尾不加分号
    3. 宏函数的形式参数不加类型

    另外宏定义需要注意的
    1. 宏定义可以嵌套
    2. 宏定义不能出现在字符串的“”中
    3. 宏定义不分配内存,变量定义才分配内存
    4. 宏定义只是简单的替换,而且是直接对源码的字符串替换,如下面的宏定义就不能很好的表达求平方函数:

    #define sqrt(x) x*x
    ...
    int y=sqrt(1+2); //y = 1+2*1+2 = 59

    这时候加上括号就好了:

    #define sqrt(x) (x)*(x)
    ...
    int y=sqrt(1+2); //y = (1+2)*(1+2) = 9

    5. 宏函数和自定义函数相比,效率更高但是安全性低且会使编译生成的目标文件变大;宏函数没有分配和释放栈帧、传参、传返回值等一系列工作,适合那些简短并且频繁调用的函数,但是对于递归则不推荐使用宏

    展开全文
  • 一些初学C语言的人,不知道头文件(*.h文件)原来还可以自己写的。只知道调用系统库函数时,要使用#include语句将某些头文件包含进去。其实,头文件跟.C文件一样,是可以自己写的。头文件是一种文本文件,使用文本...

    一些初学C语言的人,不知道头文件(*.h文件)原来还可以自己写的。只知道调用系统库函数时,要使用#include语句将某些头文件包含进去。其实,头文件跟.C文件一样,是可以自己写的。头文件是一种文本文件,使用文本编辑器将代码编写好之后,以扩展名.h保存就行了。头文件中一般放一些重复使用的代码,例如函数声明,变量声明,常数定义,宏的定义等等。当使用#include语句将头文件引用时,相当于将头文件中所有内容,复制到#include处。为了避免因为重复引用而导致的编译错误,头文件常具有: 

    #ifndef _DELAY_H_

    #define _DELAY_H_

           //代码部分

    #endif

    的格式。

    其中,DELAY为一个唯一的标号,命名规则跟变量的命名规则一样。常根据它所在的头文件名来命名,例如,如果头文件的文件名叫做stc15w.h,那么可以这样使用:

    #ifndef _STC15W_H_

    #define _STC15W_H_

           //代码部分

    #endif

    这样写的意思就是,如果没有定义__STC15W_H__,则定义__STC15W_H__,并编译下面的代码部分,直到遇到#endif。这样,当重复引用时,由于__STC15W_H__已经被定义,则下面的代码部分就不会被编译了,这样就避免了重复定义。另外,使用#include时,使用引号“”与尖括号<>的意思是不一样的。使用引号“”时,首先搜索工程文件所在目录,然后再搜索编译器头文件所在目录;而使用尖括号< >时,刚好是相反的搜索顺序。

    假设我们有两个文件名一样的头文件stc15w.h,但内容却是不一样的。一个保存在编译器指定的头文件目录下,我们把它叫做文件I;另一个则保存在当前工程的目录下,我们把它叫做文件II。如果我们使用的是#include ,则我们引用到的是文件I。如果我们使用的是#include “stc15w.h”,则我们引用的将是文件II。

    转载于:https://www.cnblogs.com/moegarn/p/10913710.html

    展开全文
  • c++头文件的简单使用

    2016-04-16 00:15:09
    c++的文件分为两个部分,头文件.h和执行文件.cpp,一个c++文件可以由多个头文件和执行文件组成,头文件不会被编译,但它的内容会被编译,当.cpp文件编译时,包含的头文件内容会被合到相应的.cpp文件中进行编译,c++...

    c++的文件分为两个部分,头文件.h和执行文件.cpp,一个c++文件可以由多个头文件和执行文件组成,头文件不会被编译,但它的内容会被编译,当.cpp文件编译时,包含的头文件内容会被合到相应的.cpp文件中进行编译,c++支持分别编译,一个.cpp文件中可以使用另一个.cpp的函数,但是它们之间的编译可以是独立的,此时只需要在使用的那个.cpp文件中声明需要的那个函数就行,声明与定义是不同的两个概念,声明只需要写出函数的形式,表明有这么个东西就行,定义需要完整地描述函数的实现过程,如果需要声明的东西太多,我们就可以将它们都放在头文件里,这样,只需要在.cpp里#include "头文件名"就可以使用包含的函数了,下面是一个简单的例子,实现的平台是linux ubuntu 14.04:

    建立三个文档:main.cpp、print.cpp、header.h,具体内容如下:

    -------------main.cpp---------------

    #include "header.h"
    int main()
    {
    char ch = 'a';
    print(ch);
    }

    ------------print.cpp----------------

    #include<iostream>
    using namespace std;
    void print(char ch)
    {
    //a ++;
    cout << ch << endl;
    }

    ---------header.h-------------

    void print(char);

    在linux下进入文件所在目录,然后用“g++ main.cpp -c”和“g++ print.cpp -c”编译.cpp文件,编译完成后会生成print.o和main.o两个目标文件,用“g++ print.o main.o -o ch”进行链接,最后用“./ch”运行文件,结果如下:


    头文件中不能出现定义的语句,因为声明可以进行多次,但是定义如果进行多次就会出现重定义的问题,试想如果只是在一个.cpp文件包含头文件还好,如果同时有多个.cpp文件包含同一个头文件的话,那么编译器便不知道应该听从那个定义了,如下所示,我们在头文件header.h中定义一个变量a,在main.cpp和print.cpp中同时包含该头文件,结果在链接的时候便会提示重定义问题:


    头文件中只能包含变量或者函数的声明,如:“extern int a;“和“void f();”,但有三种情况除外,const对象的定义、inline内联函数的定义、类的定义。

    1) const对象默认非extern,只在被包含文件中可见,在其他文件不可见,不会导致重定义,且const值不可更改,所有文件看到的值相同,同理stacic对象也可以定义;

    2) 内联函数不会单独进行编译,编译器会在遇到时进行内联展开,所以编译器需要看到内联函数的完整定义,c++规定,内联函数可以进行多次定义,但是在一个.cpp文件中只能出现一次,且在所有.cpp文件中定义相同,所以内联函数可以在头文件中定义。

    3) 编译器需要在类完全可见的情况下才能对类的对象进行布局,如,类的内存布局,一般情况下,把类的定义放在头文件中,而把函数成员的实现代码放在一个.cpp文件中。

    上述例外可以在不同的源文件多次定义,但是不能在同一个源文件中多次定义,为了确保同一.cpp文件不会包含多次头文件的定义,可以在头文件中使用

    #ifndef *** //名字任意取,不重复就好,一般用对应头文件名的全大写来表示,如,HEADER_H

    #define ***

    ...

    #endif

    来保证头文件不会被重复定义,下面是一个实际的例子,header.h里面已经包含了temp.h,main.cpp同时包含了header.h和temp.h,不使用#ifndef的结构,temp.h会被重复包含,其中的内容就会重定义,使用#ifndef结构,在编译前会先检查temp.h是否已经定义,若定义过则不再定义,可很好地防止重定义的情况。

    -------------main.cpp---------------

    #include "header.h"
    #include "temp.h"
    int main()
    {
    char ch = 'a';
    print(ch);
    }

    ------------print.cpp----------------

    #include<iostream>
    using namespace std;
    void print(char ch)
    {
    cout << ch << endl;
    }

    ---------header.h-------------

    #ifndef   _bbb_   
    #define   _bbb_ 
    #include "temp.h"
    void print(char);
    class b{};
    #endif

    ---------temp.h--------------

    #ifndef   _aaa_   
    #define   _aaa_   
    class aaa{};  
    #endif

    --------------------------------


    参考文献:http://www.cnblogs.com/lidabo/archive/2012/04/17/2454568.html

    展开全文
  • C语言头文件详解

    2019-05-11 14:08:47
    简单一句话:在include的地方,把头文件里的内容原封不动的复制到引用该头文件的地方。 头文件的引用 头文件引用有两种形式:#include < stdio.h> 和 include "main.h “。 用< >引用的一般是编译器提供...

    include的作用

    简单一句话:在include的地方,把头文件里的内容原封不动的复制到引用该头文件的地方。

    头文件的引用

    头文件引用有两种形式:#include < stdio.h> 和 include "main.h “。
    用< >引用的一般是编译器提供的头文件,编译时会在指定的目录中去查找头文件。具体是哪个目录,编译器知道,我们不用关心。用” “引用的一般是自己写的头文件,编译时,编译器会在项目所在的文件夹中进行查找。
    总结:系统提供的头文件用< >引用, 自己写的用” "引用。

    头文件的内容

    头文件里一般包括宏定义, 全局变量, 函数原型声明,头文件。

    头文件格式说明

    #ifndef 头文件名 	//头文件名的格式为"_头文件名_",注意要大写
    #define 头文件名
    
    头文件内容
    
    #endif
    

    示例代码:头文件main.h

    #ifndef _MAIN_H_    //如果没有定义头文件main.h,则执行下面的代码。这是防止重复定义
    #define _MAIN_H_	//定义头文件
    
    //下面的代码是头文件的内容
    #include<stdio.h>//头文件
    #define ADD 1 //宏定义
    extern int x; //全局变量
    void swap(int a, int b);//函数声明
    
    #endif	//表示头文件结束
    
    展开全文
  • 想必很多人都看过“头文件中用到的#ifndef/#define/#endif来防止该头文件被重复引用”。但是是否能理解“被重复引用”是什么意思?头文件被重复引用了,会产生什么后果?是不是所有的头文件中都要加入#ifndef/#...
  • 想必很多人都看过“头文件中的 #ifndef #define #endif 防止该头文件被重复引用”。但是是否能理解“被重复引用”是什么意思?是不能在不同的两个文件中使用include来包含这个头文件吗?如果头文件被重复引用了,会...
  • #ifndef 在头文件中的作用 在一个大的软件工程里面,可能会有多个文件同时包含一个头文件,当这些文件编译链接成一个可执行文件时 ,就会出现大量“重定义”的错误。在头文件中实用#ifndef #define #endif能避免...
  • 例如:要编写头文件test.h  在头文件开头写上两行:  #ifndef _TEST_H  #define _TEST_H//一般是文件名的大写  ············  ············  头文件结尾写上一行:...
  • 头文件

    2019-05-31 12:02:42
    #include 是一个来自C语言的宏命令,它在编译器进行编译之前,即在预编译的时候就会起作用。 /* main.cpp */ #include "math.h" main() { int number1 = f1(); int number2 = f2(number1);...double f2(d...
  • 简单的说其实要理解C文件与头文件(即.h)有什么不同之处,首先需要弄明白编译器的工作过程,一般说来编译器会做以下几个过程: 1.预处理阶段  2.词法与语法分析阶段  3.编译阶段,首先编译成纯汇编语句,再将...
  • 自己写的头文件没有办法引用,原来是因为没有包括在一个项目里。 步骤如下:   首先新建一个文件夹 在DEV中新建一个项目,选择空项目,保存到上一步的文件夹中 在项目里新建自己的c文件 主函数 c...
  • 多个.c文件和头文件

    2018-01-07 16:45:06
    在实际的开发项目当中 ,我们通常需要自己编写自己的头文件。下面以实现add为例子来写一个多文件 头文件: 结构体初始化函数: add业务函数: 主业务函数: main函数: 所有的.c和头文件都写好...
  • 在项目实践中,如果一个.c文件程序过长,可以把文件中的函数单独放在一个头文件中,然后在.c中包含该头文件即可。这两天,根据所看的书《C语言的科学与艺术》和网上的资料,发现实际上有两种写法。 写法1:在.h...
  • 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 这...
  • 标准头文件:使用&lt;&gt;包含的头文件 先到/usr/include里去寻找该头文件,找不到的话到当前目录非标准头文件:使用""包含的头文件 直接到当前目录找该头文件在源文件中包含的头文件如果在/usr/...
  • 问题:使用#include包含头文件,用尖括号&lt;&gt;和双引号""括起有什么区别?测试:项目环境:Microsoft Visual Studio Professional 2017创建个“空项目”,通过项目“配置属性”弹窗-&gt;...
  • 一般而言,在vs中,很少使用源文件,大部分是使用对类进行声明的头文件和封装了类的链接库(静态lib或动态dll)。如果要使用这些类,需要在文件中包含头文件的名字,如#include “cv.h”。但这个并不够,因为这个...
  • 今天总结一下如何在C++中使用头文件来定义一个类,并在另一个文件中进行引用。 部分基础知识 在一个C++程序中,有两种基础的文件 头文件(.h)【应该是head的缩写】 源文件(.cpp)【Cplusplus的缩写】 头文件中一般...
  • c语言头文件的声明

    2018-09-12 10:55:37
    头文件 头文件,顾名思义就是定义在C语言文件头部的那一坨东西 #include &lt;stdio.h&gt;   这就是一个标准输入输出的头文件声明,头文件声明写在定义文件(后缀名.c的文件)的头部,并在定义文件中具体...
1 2 3 4 5 ... 20
收藏数 670,547
精华内容 268,218
关键字:

头文件