宏和头文件顺序|C语言定义一个头文件的格式和引用它的方法

|

❶ keil中头文件的添加顺序有讲究吗

当然有讲究。例如如果头文件B用到了头文件A中的定义,那么必须在头文件A之后包含。编译器是严格按照顺序来进行预处理的。

❷ C语言定义一个头文件的格式和引用它的方法

扩展名为.h的文件,在C语言中被称为header file, 也就是头文件。

头文件的数据格式就是普通的文本文件,可以通过新建文本文件(txt),再把扩展名改为.h的方式创建,在此不赘述。

一、头文件内容格式。

头文件内容并没有固定的格式要求,不过一般为防止嵌套引用给编译器带来死锁或者没必要的开销,一般约定整个头文件中所有内容在一个条件编译下,即如下格式:

#ifndef 宏名

#define 宏名

//头文件主体

#endif

这样可以保证一个头文件在一个源文件中最多只被引用一次。为避免宏名重复,宏名一般由头文件名转换而来,如果头文件名是xxx.h,那么宏名一般定义为:

_XXX_H_

即前后各加一个下划线,同时文件名中除数字、字母、下划线以外的字符均转换为下划线(_)。

头文件主体中内容同样没有做强制约定,可以出现在源文件(.c)中的任何代码均可以放在头文件中。不过一般情况下可以包括以下几种内容:

1 引用其它头文件,格式为

#include <xxx.h>

#include "xxx.h"

二者区别在介绍头文件引用时再详细介绍。

2 定义私有类型。比如

typedef unsigned long U32; //为了简写而给无符号32位整型定义一个新的名字

struct xxx {};

也可以是enum, union等复杂类型。

3 宏定义。比如

#define MAX(a,b) (a>b?a:b)

4 函数声明。比如

void test_function(void);

5 全局变量声明。比如

extern int global_var;

6 如果有一个静态全局变量需要在不同源文件中使用,但各文件之间互不相关。那么可以放在头文件中。如:

static int gs_var = 3;

7 对于支持C99规范的C编译器,还可以把内联函数定义在头文件中。比如

staticinlineintget_min(inta,intb){if(a>b)returnb;returna;}

以上是常见的头文件中的元素。但实际上头文件中也可以放全局变量的定义,全局函数的实现等。但是头文件中一旦定义了这样的元素,这个头文件在一个工程中只能被一个文件引用,否则编译器会报重复定义的错误。

比如如果有一个规模很大的常量数组,比如一副图片的二进制值,如果把它定义在源文件中,就会显得很冗余,因为并不会经常修改。 这时可以定义在头文件中,只在一个源文件中引用,当有多幅图片需要随时更换时,也可以通过简单的在源文件中修改引用的头文件名达到修改的目的。

二、头文件的引用。

头文件引用的方法其实之前已经大致说过了,在源文件中引用头文件和在头文件中引用的格式是一样的:

#include<xxx.h>或者

#include "xxx.h"

xxx为头文件名。

用<>和""是有一定的区别的。在编译器查找头文件的时候,会在两个区域分别查找。

一个是系统头文件区域,即类似于stdio.h一类的C库函数头文件区。

另一个是自定义头文件区,比如当前目录,以及其它自定义的目录。

用<>时,编译器会先在系统区域查找,然后再查找自定义区域。而用""时则相反。

由于一般并不推荐自定义头文件名与系统头文件名相同(容易引起歧义并难以维护),所以先后顺序并不是太重要,尤其在硬件速度越来越快的今天,使用哪种符号引用头文件已经差别很小了。

❸ 请问宏和头文件有什么的区别吗

宏定义是#define A B,宏调用就是每次遇到A就替换成B。头文件定义就是写在一个源文件中,头文件调用就是#include "tou.h"。在同一个程序中,宏可以多次调用展开,头文件只能调用展开一次。所以说它们两个的定义方式不同,调用方式不同,调用次数不同。但是它们也有联系,你可以把宏放在头文件中(正如ls所说),也可以把头文件放在宏定义中。

❹ VC中define定义的宏应该放在头文件还是源文件

定义,为了便于使用可另外在头文件中声明。(理解定义和声明的区别)函数原型、数据结构、宏根据使用的范围而定,只在一个cpp中使用,就在那个cpp中定义就可以了,否则放到一个公共的头文件中。类一般在头文件中定义。另外,虚机团上产品团购,超级便宜

❺ 关于宏定义与头文件

包含了这个头文件的文件里的任何地方都可以用比如说有个头文件叫 a.h,里面定义了#define TRUE 1#define FALSE 0有个头文件 a.c包含了这个头文件a.h那么a.c里的任何地方都可以使用TRUE和FALSE如果还有个b.c,但是没包含a.h,那么b.c里就不能使用TRUE和FALSE

❻ C语言中#include和#define的顺序

C语言的预处理是有预处理器来实现的,它本质上是一个文本处理程序,自上而下、自左而右的的根据预处理指令来进行处理的,顺序就是编写的源码中的预处理指令。比如

#define__DEBUG//先处理,如果定义了__DEBUG的宏#include<debug.h>//就添加debug.h的头文件#endif

❼ C语言中,宏和头文件的关系

条件编译只是宏的一种用法:

#ifndef__SOMETHING_H__#define__SOMETHING_H__#endif/*__SOMETHING_H__*/

里面的 __SOMETHING_H__ 选取与头文件同名只是为了方便区分,当然可以用其它的名称,但一定要保证唯一。

宏同样可以放在 .c 文件中,放在头文件是为了让所有包含它的代码可以共用这一宏

❽ c语言多个文件时应该怎么定义函数、头文件、宏等

一般情况下 同一个功能模块 包含 一个头文件 和 一个.c源文件;如 study.c study.h相关的宏定义 结构体等数据定义 以及函数声明 都放到 头文件中 函数定义则放在 .c源文件中,且需要在 .c文件中添加一行 #include "study.h" 包含这个头文件 如果要用到这个模块的功能的其他源文件 比如主测试源文件 main.c#include"study.h" //这里必须包含这个头文件int main(){ …… //调用study.h中声明了,且在study.c中定义了的函数}

❾ VC中define定义的宏应该放在头文件还是源文件

要搞清楚宏是干什么的可以理解为符号替换,即出现m_xBlock的地方将会被10代替,这个过程是在预编译期完成的到程序编译的时候,代码就是这样的了for(inti=0;i<10;i++)另外,宏在预编译期替换的过程,通常叫做宏展开

❿ 当使用宏隐藏函数时,在头文件中宏定义和函数原型哪一个必须放在前面

函数原型放在中间,新的定义放在右边


赞 (0)