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变量名该节
  “……名字是由字母和数字组成的序列,但其第一个字符必须是字母。下划线被看做是字母……由于库例程的名字通常以下划线开头,因此变量名不要以下划线开头……”
 
  首先是楼主那几个函数是系统文件自代函数,所以一般系统变量或函数名前会加上下划线以示区分    .  和头文件的下划线是 两码事
 
 
 

C语言中头文件怎么写?(本文来源网络,由黑乌鸦进一步完善)的更多相关文章

  1. C语言中头文件和cpp文件解析

    务必提前预读这里的内容:http://www.cnblogs.com/stemon/p/3999844.html 回到cpp文件与头文件各写什么内容的话题上: 理论上来说cpp文件与头文件里的内容,只 ...

  2. C语言中头文件——你乱吗????

    如果尔等之辈问本大神,为什么需要头文件呢?本大神告诉你:想要知道为什么需要头文件的话,你就应该知道C语言编译的过程: 本大神为你们准备了基本知识: C语言文件的编译与执行的四个阶段并分别描述: C++ ...

  3. C语言中头文件<stdio.h>中的#ifndef _STDIO_H_

    先了解这里的相关知识:http://www.cnblogs.com/stemon/p/4000468.html 头文件的中的#ifndef,这是一个很关键的东西.比如你有两个C文件,这两个C文件都in ...

  4. C语言中头文件尖括号和引号的区别

    用include 引用头文件时,双引号和尖括号的区别: 1.双引号:引用非标准库的头文件,编译器首先在程序源文件所在目录查找,如果未找到,则去系统默认目录查找,通常用于引用用户自定义的头文件. 2.尖 ...

  5. C语言头文件怎么写?(转载)

    ---恢复内容开始--- c语言头文件怎么写?我一直有这样的疑问,但是也一直没去问问到底咋回事:所以今天一定要把它弄明白! 其实学会写头文件之后可以为我们省去不少事情,可以避免书写大量的重复代码,还在 ...

  6. C++中头文件与源文件的作用详解

    一.C++ 编译模式 通常,在一个 C++ 程序中,只包含两类文件―― .cpp 文件和 .h 文件.其中,.cpp 文件被称作 C++ 源文件,里面放的都是 C++ 的源代码:而 .h 文件则被称作 ...

  7. C/C++ 中头文件相互包含引发的问题

    转自:http://blog.csdn.net/hazir/article/details/38600419 今天下午遇到一个头文件相互包含而导致的编译问题,花了我不少时间去调试没找到问题,最后晚上跟 ...

  8. C++ 中头文件(.h)和源文件(.cc)的写法简述

    用C++编写比较大型的项目时,文件的分割管理确实确实是非常必要的 .下面就非常简洁明了地谈谈头文件(.h)和源文件(.cc)应该怎么写. 头文件(.h):写类的声明(包括类里面的成员和方法的声明).函 ...

  9. c中头文件在cpp文件里引用和.h文件引用的思考

    我们在编敲代码中头文件是常常使用的. 可是头文件是应该包括在.H文件里还是在.cpp文件里.在这个其中有什么样去差别呢. 假如说我们编写了一个a.cpp  .我们将a.cpp文件的变量和函数申明在a. ...

随机推荐

  1. CodeForces - 124B-Permutations(DFS)

    You are given n k-digit integers. You have to rearrange the digits in the integers so that the diffe ...

  2. ST表(查询区间最值问题)

    ST表与线段树相比,这是静态的,无法改动,但是他的查询速度比线段树要快,这是牺牲空间换时间的算法. O(nlogn)预处理,O(1)查询.空间O(nlogn). ][]; ]; void rmq_in ...

  3. 关于 java中的SecureRandom在linux中每次生成不同结果

    使用AES算法的时候,会发现下面的代码在windows每次产生确定的结果,但Linux就不同,导致无法正确解密 public static String encrypt(String content, ...

  4. Linux字符设备简单示例

    1. Linux字符设备是一种按字节来访问的设备,字符驱动则负责驱动字符设备,这样的驱动通常实现open.close.read和write系统调用.例如:串口.Led.按键等. 2. 通过字符设备文件 ...

  5. c++11 多线程 1

    第3章 线程间共享数据 本章主要内容 共享数据带来的问题 使用互斥量保护数据 数据保护的替代方案 保护共享数据结构的最基本的方式,是使用C++标准库提供的互斥量(mutex). 清单3.1 使用互斥量 ...

  6. MapReduce的主要的六个类讲解

    a.InputFormat类.该类的作用是将输入的文件和数据分割成许多小的split文件, 并将split的每个行通过LineRecorderReader解析成<Key,Value>,通过 ...

  7. android window(二)从getSystemService到WindowManagerGlobal

    在Activity调用getSystemService(WINDOW_SERVICE) 调用的是父类ContextThemeWrapper package android.view; public c ...

  8. 使用Nginx、Keepalived构建文艺负载均衡

    面对网站服务器端负载增大的问题,是"拿15万¥买一台服务器"来解决,还是靠"加三倍服务器"来解决?还是用其它一些办法? 对于一个访问量日益增加的网站架构而言,从 ...

  9. phpmyadmin 开放远程登录的权限

    *linux下的修改* 在phpmyadmin.conf 加上如下试一下 <Directory "phpmyadmin路径">     AllowOverride No ...

  10. Oracle 求昨天 上个月 去年 日期

    到公司发现有一个报表没有收到,查看后发现原来是Oracle数据源异常. ' day, 'yyyyMMdd') AS enddata FROM DUAL; 上面这个sql求上个月今天和昨天.一般情况下不 ...