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

我写了一个头文件canshu.h#ifdef_CANSHU_H#define_CANSHU_Hinti;#endif引用它#include<stdio.h>#includ... 我写了 一个头文件canshu.h
#ifdef _CANSHU_H
#define _CANSHU_H
int i;
#endif
引用它
#include<stdio.h>
#include"canshu.h"
void mian()
{
i=1;
printf("%d",i);
}
可是运行的时候却说'i'undeclared identifie
不知道哪里错了r
展开
 我来答
风若远去何人留
推荐于2017-09-23 · 知道合伙人互联网行家
风若远去何人留
知道合伙人互联网行家
采纳数:20413 获赞数:450065
专业C/C++软件开发

向TA提问 私信TA
展开全部

扩展名为.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编译器,还可以把内联函数定义在头文件中。比如

static inline int get_min(int a, int b)
{
    if(a>b) return b;
    return a;
}

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

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


二、头文件的引用。

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

#include<xxx.h>或者

#include "xxx.h"

xxx为头文件名。

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

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

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

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

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

百度网友2065fd337
2012-05-09 · TA获得超过114个赞
知道答主
回答量:37
采纳率:0%
帮助的人:20.4万
展开全部
如果未定义就定义一个,你弄成如果定义就定义!!!
追问
你在说什么啊,我不明白你的意思
追答
#ifdef _CANSHU_H
#define _CANSHU_H
上面的意思就是”如果定义就定义“,逻辑错误

#ifndef _CANSHU_H
#define _CANSHU_H
如果未定义就定义一个,这样逻辑才对
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
linux001
2012-05-09 · TA获得超过1401个赞
知道大有可为答主
回答量:1665
采纳率:100%
帮助的人:1299万
展开全部
第一句 改为 #ifndef _CANSHU_H
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式