zoukankan      html  css  js  c++  java
  • C语言中头文件怎么写?(本文来源网络,由黑乌鸦进一步完善)

     
    c语言头文件怎么写?我一直有这样的疑问,但是也一直没去问问到底咋回事;所以今天一定要把它弄明白!
    其实学会写头文件之后可以为我们省去不少事情,可以避免书写大量的重复代码、有利于整理思路、使代码脉络更加清晰...
    总之,好处多多学起来还不难就对了,还在等什么快来看看吧!
     
    首先,我们要建一个头文件,命名为abc.h
     
    然后就是内容了,其大致格式如下:
    #ifndef __ABC_H__  //ifndef 实际上就是“if not define”  如果没有定义 
    #define __ABC_H__
    //以上是为了防止头文件被多次包含,可以省略 但最好有
    //后面的文件名可以随意  但必须是大写+下滑线形式  还要保证名字唯一  所以这里建议是文件名的大写形式 
     
    /*-------------[将要写入的代码]--------------*/ 
    //以下是头文件,可有可无
    #include <math.h>
     
    //以下是宏定义,可有可无
    #define MAX 100
    #define MIN 0
     
    //以下是结构声明,可有可无
    typedef struct{
      int a;
    }ABC;
     
    //以下是函数声明,可有可无
    void abcfun(int a,int b);
     
    //以下是函数定义,可有可无
    uint add(uchar a, uchar b)
    {
      return a+b;
    }
    ...
    /*----------------------------------------------*/
     
    #endif   //这里与上面的 #ifndef 是一对预编译
     
    在c语言中头文件的作用是什么?
     
    1,头文件可以定义所用的函数列表,方便查阅你可以调用的函数;
    2,头文件可以定义很多宏定义,就是一些全局静态变量的定义,在这样的情况下,只要修改头文件的内容,程序就可以做相应的修改,不用亲自跑到繁琐的代码内去搜索。
    3,头文件只是声明,不占内存空间,要知道其执行过程,要看你头文件所申明的函数是在哪个.c文件里定义的,才知道。
    4,他并不是C自带的,可以不用。
    5,调用了头文件,就等于赋予了调用某些函数的权限,如果你要算一个数的N次方,就要调用Pow()函数,而这个函数是定义在math.c里面的,要用这个函数,就必需调用math.h这个头文件。
    6,在嵌入式开发中,我们可以试着将那些固定的初始化操作,全部扔进头文件中,然后随心所欲的调用它们。
     
    C语言头文件中,下划线具体是什么意思?请问有没有高手指点一下?
     
    下划线没有什何特别的意思,就是一个变量的一部分,就是你定义char str[10],char _str[10],他们俩是不同的变量名,然后都是一个字符串变量,一般头文件里或者宏定义都在变量前加一个下划线,这都是习惯问题,以示和普通函数里变量的区别,
     
    学C的时候老师好像说过,系统自己的变量一般都以下划线开头,以示区分。
     
      #If define, #ifdef(#ifndef), #else, #endif, #if等都属于预处理条件编译的命令。预处理就是在进行编译的第一遍词法扫描和语法分析之前所作的工作。说白了,就是对源文件进行编译前,先对预处理部分进行处理,然后对处理后的代码进行编译。这样做的好处是,经过处理后的代码,将会变的很精短。    
    1、   先来看一下,一个简单的应用,就是在头文件中使用。
     
      #ifndef  
      #define
     
      [将要写入的代码]
     
      #endif  
     
      这三条指令。头件的中的#ifndef(if not define),这是一个很关键的东西。比如你有两个C文件,这两个C文件都include了同一个头文件。而编译时,这两个C文件要一同编译成一个可运行文件,于是问题来了,大量的声明冲突。怎么办?
      还是把头文件的内容都放在 #ifndef 和 #endif 中吧。不管你的头文件会不会被多个文件引用,你都要加上这个,以防万一嘛!
    所以一般格式是这样的:
      #ifndef <标识>
      #define <标识>
     
      [将要写入的代码]
     
      #endif
     
      <标识>在理论上来说可以是自由命名的,但每个头文件的这个“标识”都应该是唯一的。标识的命名规则一般是头文件名全大写,前后加下划线,并把文件名中的“.”也变成下划线,如:delay.h
      #ifndef _DELAY_H_
      #define _DELAY_H_
     
      [将要写入的代码]
     
      #endif
      这一个在一般的小型程序中经常用到,在做单片机的的程序时,经常把一些可以独立的模块写成头文件,方便程序的阅读和移植。
     
    我看了老长时间的书,终于明白为什么是:
     
      #ifndef _DELAY_H_
      #define _DELAY_H_ 
     
    而不是:   
     
      #ifndef DELAY.H  
      #define DELAY.H 
     
      因为,后者,定义一个名称,是用于一个程序中或者头文件中的,名称定义
      前者,是关于头文件包含的,不是名称定义的。用下划线代替“.”,是没有办法的办法,只有这样才能防止混乱。
     
      前者的意思是:如果没有包含了这个头文件,就包含它。
      后者的意思是:如果没有定义这个名称,就定义它。
     
      其实就是换一种写法 以区分两种意思。 两者是不一样的意思。
     
    摘自那本两个老外写的经典权威《C程序设计语言(第二版)》 第2章 2.1变量名该节
      “……名字是由字母和数字组成的序列,但其第一个字符必须是字母。下划线被看做是字母……由于库例程的名字通常以下划线开头,因此变量名不要以下划线开头……”
     
      首先是楼主那几个函数是系统文件自代函数,所以一般系统变量或函数名前会加上下划线以示区分    .  和头文件的下划线是 两码事
     
     
     
  • 相关阅读:
    <script>标签的加载解析执行
    百度地图API位置偏移的校准算法
    开源实时消息推送系统 MPush
    开源GIS软件 4
    Bootstrap 只读输入框
    javascript中的后退和刷新
    HTML中的文本框textarea标签
    Spring Boot 特性 —— SpringApplication
    SpringMVC使用POST方法传递数据,却出现Request method 'GET' not supported?
    springboot的登录拦截机制
  • 原文地址:https://www.cnblogs.com/gaosheng-221/p/6193649.html
Copyright © 2011-2022 走看看